aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--Doxyfile.in8
-rw-r--r--Makefile.am5
-rw-r--r--README.md4
-rw-r--r--TODO-RELEASE9
-rw-r--r--configure.ac25
-rwxr-xr-xcontrib/jenkins.sh2
-rw-r--r--contrib/libosmo-netif.spec.in20
-rw-r--r--debian/changelog254
-rw-r--r--debian/compat2
-rw-r--r--debian/control17
-rw-r--r--debian/copyright2
-rw-r--r--debian/libosmonetif11.install (renamed from debian/libosmonetif8.install)0
-rw-r--r--examples/Makefile.am5
-rw-r--r--examples/ipa-stream-client.c37
-rw-r--r--examples/ipa-stream-server.c39
-rw-r--r--examples/osmux-test-input.c15
-rw-r--r--examples/osmux-test-output.c12
-rw-r--r--examples/stream-client.c82
-rw-r--r--examples/stream-server.c84
-rw-r--r--include/osmocom/netif/Makefile.am9
-rw-r--r--include/osmocom/netif/amr.h116
-rw-r--r--include/osmocom/netif/datagram.h13
-rw-r--r--include/osmocom/netif/ipa.h27
-rw-r--r--include/osmocom/netif/osmux.h45
-rw-r--r--include/osmocom/netif/prim.h66
-rw-r--r--include/osmocom/netif/rtp.h4
-rw-r--r--include/osmocom/netif/sctp.h60
-rw-r--r--include/osmocom/netif/stream.h178
-rw-r--r--include/osmocom/netif/stream_private.h42
-rw-r--r--libosmo-netif.pc.in2
-rw-r--r--src/Makefile.am13
-rw-r--r--src/amr.c194
-rw-r--r--src/datagram.c31
-rw-r--r--src/ipa.c82
-rw-r--r--src/jibuf.c9
-rw-r--r--src/osmux.c988
-rw-r--r--src/osmux_input.c857
-rw-r--r--src/osmux_output.c396
-rw-r--r--src/prim.c473
-rw-r--r--src/rs232.c24
-rw-r--r--src/rtp.c6
-rw-r--r--src/sctp.c95
-rw-r--r--src/stream.c1282
-rw-r--r--src/stream_cli.c1237
-rw-r--r--src/stream_srv.c1215
-rw-r--r--tests/Makefile.am41
-rw-r--r--tests/amr/amr_test.c75
-rw-r--r--tests/amr/amr_test.ok182
-rw-r--r--tests/jibuf/jibuf_test.c4
-rw-r--r--tests/jibuf/jibuf_tool.c25
-rw-r--r--tests/osmo-pcap-test/configure.ac2
-rw-r--r--tests/osmo-pcap-test/osmux_test.c28
-rw-r--r--tests/osmux/osmux_input_test.c732
-rw-r--r--tests/osmux/osmux_input_test.ok212
-rw-r--r--tests/osmux/osmux_output_test.c (renamed from tests/osmux/osmux_test2.c)183
-rw-r--r--tests/osmux/osmux_output_test.ok (renamed from tests/osmux/osmux_test2.ok)11
-rw-r--r--tests/osmux/osmux_test.c122
-rw-r--r--tests/osmux/osmux_test.ok1553
-rw-r--r--tests/stream/stream_test.c555
-rw-r--r--tests/stream/stream_test.err20
-rw-r--r--tests/stream/stream_test.ok138
-rw-r--r--tests/testsuite.at14
-rw-r--r--utils/Makefile.am19
-rw-r--r--utils/osmo-amr-inspect.c325
65 files changed, 9011 insertions, 3317 deletions
diff --git a/.gitignore b/.gitignore
index 4296476..5dfa913 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,6 +24,7 @@ ltmain.sh
install-sh
stamp-h1
libtool
+*~
.tarball-version
.version
diff --git a/Doxyfile.in b/Doxyfile.in
index 3843f79..bdd70e3 100644
--- a/Doxyfile.in
+++ b/Doxyfile.in
@@ -150,7 +150,7 @@ SHORT_NAMES = NO
# comments will behave just like regular Qt-style comments
# (thus requiring an explicit @brief command for a brief description.)
-JAVADOC_AUTOBRIEF = NO
+JAVADOC_AUTOBRIEF = YES
# If the QT_AUTOBRIEF tag is set to YES then Doxygen will
# interpret the first line (until the first dot) of a Qt-style
@@ -158,7 +158,7 @@ JAVADOC_AUTOBRIEF = NO
# will behave just like regular Qt-style comments (thus requiring
# an explicit \brief command for a brief description.)
-QT_AUTOBRIEF = NO
+QT_AUTOBRIEF = YES
# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
# treat a multi-line C++ special comment block (i.e. a block of //! or ///
@@ -328,13 +328,13 @@ EXTRACT_PRIVATE = NO
# If the EXTRACT_STATIC tag is set to YES all static members of a file
# will be included in the documentation.
-EXTRACT_STATIC = YES
+EXTRACT_STATIC = NO
# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
# defined locally in source files will be included in the documentation.
# If set to NO only classes defined in header files are included.
-EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_LOCAL_CLASSES = NO
# This flag is only useful for Objective-C code. When set to YES local
# methods, which are defined in the implementation section but not in
diff --git a/Makefile.am b/Makefile.am
index 55a650a..f50cd0f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,7 +1,7 @@
AUTOMAKE_OPTIONS = foreign dist-bzip2 1.6
ACLOCAL_AMFLAGS = -I m4
-SUBDIRS = include src examples tests
+SUBDIRS = include src examples utils tests
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libosmo-netif.pc
@@ -11,6 +11,7 @@ EXTRA_DIST = \
README.md \
contrib/libosmo-netif.spec.in \
debian \
+ git-version-gen \
$(NULL)
@RELMAKE@
@@ -29,7 +30,7 @@ html_DATA = $(top_builddir)/doc/html.tar
$(html_DATA): $(top_builddir)/doc/html/index.html
cd $(top_builddir)/doc && tar cf html.tar html
-$(top_builddir)/doc/html/index.html: $(SOURCES) Doxyfile
+$(top_builddir)/doc/html/index.html: $(top_srcdir)/src/*.c $(top_srcdir)/include/osmocom/netif/*.h Doxyfile
@rm -rf doc
mkdir -p doc
$(DOXYGEN) Doxyfile
diff --git a/README.md b/README.md
index 01267ea..02814fd 100644
--- a/README.md
+++ b/README.md
@@ -17,9 +17,9 @@ GIT Repository
You can clone from the official libosmo-netif.git repository using
- git clone git://git.osmocom.org/libosmo-netif.git
+ git clone https://gitea.osmocom.org/osmocom/libosmo-netif
-There is a cgit interface at <http://git.osmocom.org/libosmo-netif/>
+There is a web interface at <https://gitea.osmocom.org/osmocom/libosmo-netif>
Documentation
-------------
diff --git a/TODO-RELEASE b/TODO-RELEASE
index c89dec9..83bc188 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -7,4 +7,11 @@
# If any interfaces have been added since the last public release: c:r:a + 1.
# If any interfaces have been removed or changed since the last public release: c:r:0.
#library what description / commit summary line
-libosmo-netif ipv6 Depends on libosmocore > 1.4.0 for IPv6 osmo_sock_inti2_multiaddr AF_UNSPEC (IPv6) support.
+libosmocore >1.9.0 working osmo_sock_init2_multiaddr2() without setting flag OSMO_SOCK_F_BIND
+libosmocore >1.9.0 use osmo_sock_multiaddr_get_name_buf()
+libosmocore >1.9.0 use OSMO_IO_FD_MODE_RECVMSG_SENDMSG
+libosmocore >1.9.0 use osmo_iofd_get_ioops()
+libosmo-netif added osmo_stream_srv_get_sockname()
+libosmo-netif update-dependency libosmocore > 1.9.0 required for I89eb519b22d21011d61a7855b2364bc3c295df82
+libosmo-netif ADD osmo_stream_srv_link_get_name(), osmo_stream_srv_get_name(), osmo_stream_cli_get_name()
+libosmo-netif ADD osmo_prim_srv_link_set_name(), osmo_prim_srv_set_name() \ No newline at end of file
diff --git a/configure.ac b/configure.ac
index 4c0e0b4..6b4c2be 100644
--- a/configure.ac
+++ b/configure.ac
@@ -8,6 +8,8 @@ AC_CONFIG_AUX_DIR([.])
AM_INIT_AUTOMAKE([subdir-objects dist-bzip2])
AC_CONFIG_TESTDIR(tests)
+CFLAGS="$CFLAGS -std=gnu11"
+
dnl kernel style compile messages
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@@ -22,7 +24,7 @@ AC_PROG_INSTALL
LT_INIT
AC_PROG_LIBTOOL
-dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang
+dnl patching ${archive_cmds} to affect generation of file "libtool" to fix linking with clang
AS_CASE(["$LD"],[*clang*],
[AS_CASE(["${host_os}"],
[*linux*],[archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'])])
@@ -87,10 +89,22 @@ AC_SUBST(SYMBOL_VISIBILITY)
dnl Generate the output
AM_CONFIG_HEADER(config.h)
-PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.3.0)
-PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.3.0)
-dnl FIXME: We depend on libosmoabis by now until we can move LAPD code here
-PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.6.0)
+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.9.0)
+PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 1.9.0)
+PKG_CHECK_MODULES(LIBOSMOCODEC, libosmocodec >= 1.9.0)
+
+AC_ARG_ENABLE([lapd_examples],
+ [AS_HELP_STRING(
+ [--enable-lapd-examples],
+ [Build some lapd examples]
+ )],
+ [lapd_examples=$enableval], [lapd_examples="no"])
+AS_IF([test "x$lapd_examples" = "xyes"], [
+ PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 1.5.0)
+ AC_DEFINE([ENABLE_LAPD], [1], [Enable LAPD examples])
+])
+AM_CONDITIONAL(ENABLE_LAPD, test "x$lapd_examples" = "xyes")
+AC_SUBST(ENABLE_LAPD)
AC_ARG_ENABLE([libsctp], [AS_HELP_STRING([--disable-libsctp], [Do not enable socket multiaddr APIs requiring libsctp])],
[ENABLE_LIBSCTP=$enableval], [ENABLE_LIBSCTP="yes"])
@@ -131,6 +145,7 @@ AC_OUTPUT(
include/osmocom/netif/Makefile
src/Makefile
examples/Makefile
+ utils/Makefile
tests/Makefile
Doxyfile
Makefile
diff --git a/contrib/jenkins.sh b/contrib/jenkins.sh
index bf04643..543671c 100755
--- a/contrib/jenkins.sh
+++ b/contrib/jenkins.sh
@@ -35,7 +35,7 @@ echo
set -x
autoreconf --install --force
-./configure --enable-sanitize --enable-werror
+./configure --enable-sanitize --enable-werror --enable-lapd-examples
$MAKE $PARALLEL_MAKE
$MAKE $PARALLEL_MAKE distcheck \
|| cat-testlogs.sh
diff --git a/contrib/libosmo-netif.spec.in b/contrib/libosmo-netif.spec.in
index 98d021b..4ac1302 100644
--- a/contrib/libosmo-netif.spec.in
+++ b/contrib/libosmo-netif.spec.in
@@ -24,26 +24,26 @@ BuildRequires: automake
BuildRequires: libtool >= 2
BuildRequires: lksctp-tools-devel
BuildRequires: pkgconfig >= 0.20
-BuildRequires: pkgconfig(libosmoabis) >= 0.6.0
-BuildRequires: pkgconfig(libosmocore) >= 1.0.0
-BuildRequires: pkgconfig(libosmogsm) >= 1.0.0
+BuildRequires: pkgconfig(libosmocore) >= 1.9.0
+BuildRequires: pkgconfig(libosmogsm) >= 1.9.0
+BuildRequires: pkgconfig(libosmocodec) >= 1.9.0
%description
Network interface demuxer library for OsmoCom projects.
-%package -n libosmonetif8
+%package -n libosmonetif11
Summary: Osmocom library for muxed audio
License: AGPL-3.0-or-later
Group: System/Libraries
-%description -n libosmonetif8
+%description -n libosmonetif11
Network interface demuxer library for OsmoCom projects.
%package -n libosmonetif-devel
Summary: Development files for the Osmocom muxed audio library
License: AGPL-3.0-or-later
Group: Development/Libraries/C and C++
-Requires: libosmonetif8 = %{version}
+Requires: libosmonetif11 = %{version}
%description -n libosmonetif-devel
Network interface demuxer library for OsmoCom projects.
@@ -67,11 +67,11 @@ find %{buildroot} -type f -name "*.la" -delete -print
%check
make %{?_smp_mflags} check || (find . -name testsuite.log -exec cat {} +)
-%post -n libosmonetif8 -p /sbin/ldconfig
-%postun -n libosmonetif8 -p /sbin/ldconfig
+%post -n libosmonetif11 -p /sbin/ldconfig
+%postun -n libosmonetif11 -p /sbin/ldconfig
-%files -n libosmonetif8
-%{_libdir}/libosmonetif.so.8*
+%files -n libosmonetif11
+%{_libdir}/libosmonetif.so.11*
%files -n libosmonetif-devel
%license COPYING
diff --git a/debian/changelog b/debian/changelog
index 1aa3ea1..5c71f2d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,257 @@
+libosmo-netif (1.4.0) unstable; urgency=medium
+
+ [ Max ]
+ * osmo_stream_srv_link_close(): properly handle NULL input
+ * Add osmo_stream_srv_link_is_opened()
+
+ [ Oliver Smith ]
+ * Run struct_endianness.py
+ * rtp.h: add RTP_PT_CSDATA
+ * debian: set compat level to 10
+
+ [ Neels Hofmeyr ]
+ * fix msgb leak on OSMO_STREAM_SRV_F_FLUSH_DESTROY
+
+ [ Vadim Yanitskiy ]
+ * {utils,tests}/Makefile.am: reorder libraries in LDADD
+ * tests/Makefile.am: clean up AM_* variables
+ * src/Makefile.am: do not overwrite AM_LDFLAGS
+
+ [ Daniel Willmann ]
+ * stream: Introduce and use osmo_stream_cli_fd() to get the fd
+ * stream: (typo) Change callback param name of struct osmo_stream_cli from srv to cli
+ * ipa-stream-server: Return -EBADF in read_cb after osmo_stream_srv_destroy()
+ * stream: Properly name osmo_stream_srv read callback
+ * cosmetic: Change name of osmo_stream_src_fd_cb()
+ * stream: Update log messages
+ * stream: Factor out reconnection handling
+ * stream: Use cli->state to check if cli is already closed
+ * stream: Correctly close osmo_stream_cli when in state WAIT_RECONNECT
+ * Add osmo_io support to osmo_stream_cli and osmo_stream_srv
+ * examples: Use new stream API in {ipa-,}stream-{client,server}
+ * stream: Setup ofd in osmo_stream_cli_open
+ * stream: Document osmo_stream_cli_create2()
+ * stream: Remove duplicated code in osmo_stream_cli_create()
+ * examples: Set logging level to DEBUG in {,ipa-}stream-{client,server}
+ * stream: Assert that fd is valid in stream_cli_handle_connecting()
+ * stream: Set state to closed before calling disconnect_cb()
+ * stream: Notify stream_cli on connect()
+
+ [ Pau Espin Pedrol ]
+ * stream: Allow setting name printed during logging
+ * stream: Print socket info as part of the logging context
+ * stream: Drop recently added API osmo_stream_cli_create2
+ * stream: Drop name param from recently added API osmo_stream_srv_create2()
+ * stream: srv cb: Use osmo_sockaddr and improve logging when cli connects
+ * stream: Rename static function to have correct prefix
+ * stream: Split cli/srv specific code out of stream.c
+ * stream_cli: Increase log level of established conn to INFO
+ * stream_srv: Use LOGSLNK() to print log line
+ * stream_srv: call setsockopt(SO_NOSIGPIPE) also in srv sockets
+ * stream_srv: Improve logging lines accepting new connections
+ * stream: Append data to current tail of message upon recv()
+ * stream_srv: Handle ESHUTDOWN and other write() errors destroying the socket
+ * stream_cli: Proper handling of send() socket errors
+ * sctp: Document relevant RFC specs
+ * stream_srv: sctp: Log error cause of COMM_LOST event
+ * stream_srv: Log SCTP REMOTE_ERROR events
+ * stream: Refactor sctp_recvmsg_wrapper() logging
+ * stream_cli: Forward SCTP MSG_NOTIFICATION to upper layers
+ * stream: Use new flag OSMO_SOCK_F_SCTP_ASCONF_SUPPORTED for SCTP sockets
+ * stream_test: Avoid leaking osmo_stream_srv_link
+ * stream: Use new libosmocore API osmo_sock_init2_multiaddr2()
+ * stream: Introduce API to set several transport parameters
+ * stream: Add new stream_{cli,srv_link} parameters to set SCTP_INITMSG sockopt values
+
+ [ arehbein ]
+ * stream: Fix osmo_panic log fmts
+ * examples: Add extension header octet to example
+ * ipa: Add segmentation callback
+ * stream: Add server-side (segmentation) support for IPA
+ * stream test: Fix test output check
+
+ -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 12 Sep 2023 13:50:25 +0200
+
+libosmo-netif (1.3.0) unstable; urgency=medium
+
+ [ Pau Espin Pedrol ]
+ * rtp: Delay rtph ptr assign after validating length
+ * stream: assert params are not NULL in send/recv functions
+ * stream: getsockopt ret socklen_t is unsigned
+ * osmux.h: Add missing msgb.h header
+ * osmux.h: Define default Osmux port
+ * rtp: Avoid memcpy(len=0)
+ * examples/osmux-test-output: Avoid using deprecated Osmux API
+ * osmux: Drop long time deprecated APIs
+ * osmux: Move osmux_xfrm_output_set_tx_cb() further down to the xfrm_output section
+ * osmux: Allocate struct osmux_out_handle through API
+ * osmux: Allow the user to alloc msgbs used to provide generated RTP packets
+ * osmux: osmux_xfrm_input_close_circuit(): Log circuit not found
+ * stream: Fix typos in log messages
+ * stream: Unset fd value after close() before calling closed_cb()
+ * stream: Provide caller with SCTP flags during osmo_stream_*_recv()
+ * tests/osmo-pcap-test/osmux_test: Fix return condition check for osmux_xfrm_input()
+ * osmux: Improve logging non-usual conditions
+ * osmux: osmux_xfrm_input(): Propagate error code to inform caller
+ * osmux: Avoid duplicated RTP msg trigger Tx of osmux frame
+ * osmux: Change order of lines to follow packet fill order
+ * cosmetic: osmux: Fix typo in comment
+ * osmux: Unify return codes of osmux_batch_add() and osmux_batch_enqueue()
+ * osmux: Early return on error or batch full during osmux_replay_lost_packets()
+ * osmux: assert no batch factor greater than 8 is used
+ * tests/osmux_test2: Document unit tests
+ * tests/osmux: Always run with fake time
+ * tests: rename test osmux_test2 -> osmux_output_test
+ * osmux: Print osmux_hdr rtp_m field in osmux_snprintf()
+ * amr: Add data[0] field to amr_hdr
+ * osmux: Proper encoding of osmux frames when when AMR FT changes
+ * tests/osmux: Add new osmux_input_test to validate AMR FT changes
+ * osmux: Fix AMR F,Q,CMR fields not properly encoded in osmux header
+ * cosmetic: osmux: Properly separate expressions with whitespace
+ * cosmetic: osmux: Fix typo in comment
+ * osmux: Fix osmux seqnum incremented globally instead of per circuit
+ * tests/osmux: Properly flush and free out_handle in osmux_test
+ * tests/osmux: Test rx of osmux seqnum wrap around
+ * osmux: Fix unwanted RTP marker bit upon rx of osmux seqnum wrap around
+ * stream: Set proper msgb length when returning sctp_notification
+ * stream: Erase sctp_msg_flags if receiving user data
+ * stream: Log rx of sctp notification SCTP_SEND_FAILED
+ * stream: Set sctp_ppid and sctp_stream when sctp notifciation is received
+ * stream: Remove unneeded break statement
+ * stream: Return 0 when receiving sctp notification SCTP_COMM_LOST
+ * stream: Document osmo_stream_srv_recv() SCTP specialties
+ * osmux: join osmux_xfrm_input_open_circuit() and osmux_batch_add_circuit()
+ * osmux: Take into account configured osmux_in_handle->osmux_seq field
+ * osmux: Split input and output code into separate files
+ * cosmetic: osmux: Make linter happy
+ * tests/osmo-pcap/osmux: Replace deprecated API osmux_xfrm_output_init2()
+ * osmux: Allocate struct osmux_out_handle through API
+ * osmux: Replace deprecated osmux_xfrm_input_* APIs in examples & tests
+ * osmux: Introduce API osmux_xfrm_input_get_deliver_cb_data()
+ * stream: Improve logging of SCTP_PEER_ADDR_CHANGE notification
+ * cosmetic: stream: Fix parameter name
+ * stream: Introduce APIs osmo_stream_{cli,srv}_clear_tx_queue()
+ * cosmetic: Fix indentation whitespace
+ * amr: Document SID frame length from spec
+ * osmux: Rework log formatting when replaying detected RTP gaps
+ * osmux: Use msgb_copy() API in osmux_replay_lost_packets()
+ * osmux: Log AMR FT when incorrect AMR payload size detected
+ * osmux: Fix naming of functions operating on osmux circuits
+ * osmux: rename internal struct osmux_batch -> osmux_link
+ * osmux: Add internal backpointer to in_handle to simplify param passing
+ * osmux: Fix endianness logging duplicaed seqnum
+ * osmux: Use internal struct to cache parsing state of rtp pkt from user
+ * osmux: dup in RTP pkt: check before applying queue flush due to Marker bit
+ * osmux: dup in RTP pkt: Replace potentially internally forged pkt with incoming one
+ * osmux: recreate lost RTP pkts before handling newest one
+ * osmux: Drop marker bit in forged RTP packets to fill gaps
+ * osmux: Add data[0] field to osmux_hdr
+ * osmux: Drop noop OR during assignment
+ * tests/osmux: Test replay of one lost RTP packet when generating osmux batches
+ * tests/osmux: Test incoming RTP stream with seqnum jumps during wraparound
+ * tests/osmux: Test big seqnum holes (>batch_factor) in incoming RTP stream
+ * osmux: Obey current batch_size restrictions when creating forged RTP packets to fill holes
+ * osmux: Use better rationale when limiting amount of lost & forged RTP incoming packets
+ * osmux: Avoid filling in seqnum holes upon rx of RTP pkt with M bit set
+ * osmux: Set M bit in osmuxhdr if seqnum hole found encoding RTP pkts
+ * osmux: Support recreating lost RTP packets at start of the batch
+ * osmux: Introduce API osmux_xfrm_input_set_name()
+ * osmux: Improve logging of osmux_xfrm_input
+ * tests/osmux: Add extra asserts to validate osmux header is pulled correctly
+ * amr: Guard against incorrect AMR FT passed to osmo_amr_{bits,bytes}()
+ * osmux: Check received osmuxh->amr_ft is correct before using it
+ * osmux: Refactor osmux_xfrm_output_pull() to simplify code flow
+ * osmux_output: Refactor init code to avoid calling deprecated APIs internally
+ * amr.h: Fix missing include dependencies
+ * amr: osmo_amr_bwe_to_oa(): Modify loop to allow osmo_amr_bytes()=0 (NO_DATA)
+ * amr: osmo_amr_bwe_to_oa() define variable as unsigned
+ * amr: Add struct definition for AMR BWE header
+ * tests/amr: Add test case for unused FT=14
+ * amr: Support all SID and NO_DATA amr formats
+ * osmux: Allow forwarding AMR NO_DATA frames
+ * stream: Log read/write flags
+ * stream: osmo_stream_*_write: Unifiy way to get data and length
+ * stream: Log error on short send
+ * stream: Avoid useless polling if tx_queue becomes empty
+ * stream: Fix tx data dropped upon show socket write
+ * amr.h: Fix AMR_FT_{GSM,TDMA,PDC}_EFR_SID_LEN
+ * amr: Add missing header stdbool.h
+ * amr: constify input buffer in osmo_amr_is_oa()
+ * amr: use struct bwe_hdr in osmo_amr_bwe_to_oa()
+ * amr: Clarify size of AMR BWE header and ToC
+ * amr: use OSMO_BYTES_FOR_BITS()
+ * amr: osmo_amr_bwe_to_oa(): validate input data is long enough
+ * Introduce utils/osmo-amr-inspect program
+ * osmo-amr-inspect: Improve robustness reading from stdin
+
+ [ Vadim Yanitskiy ]
+ * tests/amr: fix less-than-zero comparison of an unsigned value
+
+ [ Max ]
+ * Log more details in osmo_stream_srv_write()
+ * Properly handle send() return code
+ * Better handling of send() error
+ * Add assert for link check to osmo_stream_srv_create()
+
+ [ Harald Welte ]
+ * Support building with -Werror=strict-prototypes / -Werror=old-style-definition
+
+ -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 07 Feb 2023 13:28:19 +0100
+
+libosmo-netif (1.2.0) unstable; urgency=medium
+
+ [ Pau Espin Pedrol ]
+ * Introduce sctp.h to provide SCTP related functionalities
+ * stream: Factor out sctp_recvmg long code chunk
+ * stream: Add support for AF_UNIX sockets
+ * Introduce osmo_prim_srv APIs
+ * prim: Add internal CTL SAPI to negotiate SAP versions
+ * prim: return last error code
+ * amr: Fix FormatType from parsing BWE AMR header
+ * amr: Fix length check in bwe<->iuup converters
+
+ [ Alexander Couzens ]
+ * amr: don't rely on pad bits to be zero
+ * export osmo_amr_bits
+ * amr: Introduce APIs to convert BE to IuUP/IuFP format
+
+ [ Philipp Maier ]
+ * amr: cosmetic: fix grammer in comment
+ * amr_test: increase test coverage for oa / bwe conversation
+
+ [ Harald Welte ]
+ * update git URLs (git -> https; gitea)
+
+ -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 28 Jun 2022 18:09:49 +0200
+
+libosmo-netif (1.1.0) unstable; urgency=medium
+
+ [ Vadim Yanitskiy ]
+ * debian/control: change maintainer to the Osmocom team / mailing list
+ * stream: add missing Doxygen \return statements to non-void functions
+
+ [ Pau Espin Pedrol ]
+ * stream: Support creating sockets with IPv6 addresses
+ * stream: Fix log of IPv6 during accept()
+ * contrib/jenkins: Enable parallel make in make distcheck
+ * tests: Explicitly drop category from log
+ * gitignore: Ignore autfoo *~ churn
+ * tests: Replace deprecated API log_set_print_filename
+
+ [ Daniel Willmann ]
+ * examples: Use osmo_stream_*_set_nodelay in ipa examples
+
+ [ Harald Welte ]
+ * Use osmo_fd_setup() wherever applicable
+ * cosmetic: Fix whitespace (use tab instead of 8x space)
+ * migrate to osmo_fd_{read,write}_{enable,disable}()
+ * Don't depend on libosmo-abis (by default)
+
+ [ Oliver Smith ]
+ * configure.ac: set -std=gnu11
+
+ -- Pau Espin Pedrol <pespin@sysmocom.de> Tue, 23 Feb 2021 16:47:37 +0100
+
libosmo-netif (1.0.0) unstable; urgency=medium
[ Neels Hofmeyr ]
diff --git a/debian/compat b/debian/compat
index ec63514..f599e28 100644
--- a/debian/compat
+++ b/debian/compat
@@ -1 +1 @@
-9
+10
diff --git a/debian/control b/debian/control
index d242b48..94c11ef 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@ Source: libosmo-netif
Section: libs
Priority: optional
Maintainer: Osmocom team <openbsc@lists.osmocom.org>
-Build-Depends: debhelper (>= 9),
+Build-Depends: debhelper (>= 10),
autotools-dev,
autoconf,
automake,
@@ -11,17 +11,16 @@ Build-Depends: debhelper (>= 9),
libdpkg-perl,
git,
doxygen,
- libosmocore-dev (>= 1.3.0),
- libosmo-abis-dev (>= 0.6.0),
+ libosmocore-dev (>= 1.9.0),
pkg-config,
libpcap0.8-dev,
libsctp-dev
Standards-Version: 3.9.6
-Vcs-Browser: http://git.osmocom.org/libosmo-netif/
-Vcs-Git: git://git.osmocom.org/libosmo-netif.git
+Vcs-Browser: https://gitea.osmocom.org/osmocom/libosmo-netif
+Vcs-Git: https://gitea.osmocom.org/osmocom/libosmo-netif
Homepage: https://projects.osmocom.org/projects/libosmo-netif
-Package: libosmonetif8
+Package: libosmonetif11
Section: libs
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
@@ -38,7 +37,7 @@ Architecture: any
Depends: ${misc:Depends},
libosmocore-dev,
libosmocore,
- libosmonetif8 (= ${binary:Version})
+ libosmonetif11 (= ${binary:Version})
Multi-Arch: same
Description: Development headers for Osmocom network interface
The libosmo-netif library is one of the libraries needed by the
@@ -52,7 +51,7 @@ Package: libosmo-netif-doc
Architecture: all
Section: doc
Depends: ${misc:Depends},
- libosmonetif8,
+ libosmonetif11,
libjs-jquery
Description: Documentation for the Osmo network interface library
The libosmo-netif library is one of the libraries needed by the
@@ -65,7 +64,7 @@ Package: libosmo-netif-dbg
Section: debug
Architecture: any
Priority: extra
-Depends: libosmonetif8 (= ${binary:Version}), ${misc:Depends}
+Depends: libosmonetif11 (= ${binary:Version}), ${misc:Depends}
Multi-Arch: same
Description: Debug symbols for Osmocom network interface library
The libosmo-netif library is one of the libraries needed by the
diff --git a/debian/copyright b/debian/copyright
index 57fe8c0..c338bc9 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -1,6 +1,6 @@
Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: libosmo-netif
-Source: git://git.osmocom.org/libosmo-netif.git
+Source: https://gitea.osmocom.org/osmocom/libosmo-netif
Files: *
Copyright: 2012-2013 On-Waves
diff --git a/debian/libosmonetif8.install b/debian/libosmonetif11.install
index 7a36b86..7a36b86 100644
--- a/debian/libosmonetif8.install
+++ b/debian/libosmonetif11.install
diff --git a/examples/Makefile.am b/examples/Makefile.am
index 4125243..6d74238 100644
--- a/examples/Makefile.am
+++ b/examples/Makefile.am
@@ -4,8 +4,6 @@ AM_LDFLAGS = $(COVERAGE_LDFLAGS)
noinst_PROGRAMS = ipa-stream-client \
ipa-stream-server \
- lapd-over-datagram-user \
- lapd-over-datagram-network \
stream-client \
stream-server \
rs232-read \
@@ -27,6 +25,8 @@ ipa_stream_server_SOURCES = ipa-stream-server.c
ipa_stream_server_LDADD = $(top_builddir)/src/libosmonetif.la \
$(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
+if ENABLE_LAPD
+noinst_PROGRAMS += lapd-over-datagram-user lapd-over-datagram-network
lapd_over_datagram_user_SOURCES = lapd-over-datagram-user.c
lapd_over_datagram_user_LDADD = $(top_builddir)/src/libosmonetif.la \
$(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \
@@ -36,6 +36,7 @@ lapd_over_datagram_network_SOURCES = lapd-over-datagram-network.c
lapd_over_datagram_network_LDADD = $(top_builddir)/src/libosmonetif.la \
$(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) \
$(LIBOSMOABIS_LIBS)
+endif
stream_client_SOURCES = stream-client.c
stream_client_LDADD = $(top_builddir)/src/libosmonetif.la \
diff --git a/examples/ipa-stream-client.c b/examples/ipa-stream-client.c
index 0c9c589..b58370e 100644
--- a/examples/ipa-stream-client.c
+++ b/examples/ipa-stream-client.c
@@ -74,7 +74,7 @@ static int connect_cb(struct osmo_stream_cli *conn)
char *ptr;
int x;
- msg = osmo_ipa_msg_alloc(0);
+ msg = osmo_ipa_ext_msg_alloc(0);
if (msg == NULL) {
LOGP(DLINP, LOGL_ERROR, "cannot alloc msg\n");
return -1;
@@ -93,8 +93,7 @@ static int connect_cb(struct osmo_stream_cli *conn)
msg_sent->num = i;
llist_add(&msg_sent->head, &msg_sent_list);
- osmo_ipa_msg_push_header(msg, IPAC_PROTO_OSMO);
-
+ osmo_ipa_msg_push_headers(msg, osmo_ipa_msgb_cb_proto(msg), osmo_ipa_msgb_cb_proto_ext(msg));
osmo_stream_cli_send(conn, msg);
LOGP(DIPATEST, LOGL_DEBUG, "enqueueing msg %d of "
@@ -103,30 +102,26 @@ static int connect_cb(struct osmo_stream_cli *conn)
return 0;
}
-static int read_cb(struct osmo_stream_cli *conn)
+static int read_cb(struct osmo_stream_cli *conn, int res, struct msgb *msg)
{
- struct msgb *msg;
+ int num;
+ struct msg_sent *cur, *tmp, *found = NULL;
- LOGP(DIPATEST, LOGL_DEBUG, "received message from stream\n");
+ LOGP(DIPATEST, LOGL_DEBUG, "received message from stream (payload len=%d)\n", msgb_length(msg));
- msg = osmo_ipa_msg_alloc(0);
- if (msg == NULL) {
- LOGP(DIPATEST, LOGL_ERROR, "cannot allocate message\n");
- return 0;
- }
- if (osmo_stream_cli_recv(conn, msg) <= 0) {
- LOGP(DIPATEST, LOGL_ERROR, "cannot receive message\n");
+ if (res <= 0) {
+ LOGP(DIPATEST, LOGL_ERROR, "Event with no data! %d\n", res);
+ msgb_free(msg);
return 0;
}
+
if (osmo_ipa_process_msg(msg) < 0) {
LOGP(DIPATEST, LOGL_ERROR, "bad IPA message\n");
+ msgb_free(msg);
return 0;
}
- int num;
- struct msg_sent *cur, *tmp, *found = NULL;
-
- num = ntohl(*((int *)(msg->data + sizeof(struct ipa_head))));
+ num = osmo_load32be(msg->data);
LOGP(DLINP, LOGL_DEBUG, "received msg number %d\n", num);
llist_for_each_entry_safe(cur, tmp, &msg_sent_list, head) {
@@ -149,6 +144,7 @@ static int read_cb(struct osmo_stream_cli *conn)
LOGP(DLINP, LOGL_ERROR,
"message %d not found!\n", num);
}
+ msgb_free(msg);
return 0;
}
@@ -169,7 +165,7 @@ int main(int argc, char *argv[])
tall_test = talloc_named_const(NULL, 1, "osmo_stream_client_test");
msgb_talloc_ctx_init(tall_test, 0);
osmo_init_logging2(tall_test, &osmo_stream_client_test_log_info);
- log_set_log_level(osmo_stderr_target, LOGL_NOTICE);
+ log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
/*
* initialize stream client.
@@ -180,11 +176,12 @@ int main(int argc, char *argv[])
fprintf(stderr, "cannot create client\n");
exit(EXIT_FAILURE);
}
+ osmo_stream_cli_set_name(conn, "ipa_test_client");
osmo_stream_cli_set_addr(conn, "127.0.0.1");
osmo_stream_cli_set_port(conn, 10000);
osmo_stream_cli_set_connect_cb(conn, connect_cb);
osmo_stream_cli_set_disconnect_cb(conn, disconnect_cb);
- osmo_stream_cli_set_read_cb(conn, read_cb);
+ osmo_stream_cli_set_read_cb2(conn, read_cb);
osmo_stream_cli_set_data(conn, &num_msgs);
osmo_stream_cli_set_nodelay(conn, true);
@@ -193,6 +190,8 @@ int main(int argc, char *argv[])
exit(EXIT_FAILURE);
}
+ osmo_stream_cli_set_segmentation_cb(conn, osmo_ipa_segmentation_cb);
+
LOGP(DIPATEST, LOGL_NOTICE, "Entering main loop\n");
while(1) {
diff --git a/examples/ipa-stream-server.c b/examples/ipa-stream-server.c
index c311697..e87eab4 100644
--- a/examples/ipa-stream-server.c
+++ b/examples/ipa-stream-server.c
@@ -1,4 +1,5 @@
/* IPA stream srv example */
+#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -46,29 +47,18 @@ void sighandler(int foo)
exit(EXIT_SUCCESS);
}
-int read_cb(struct osmo_stream_srv *conn)
+int read_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg)
{
- struct msgb *msg;
-
- LOGP(DSTREAMTEST, LOGL_DEBUG, "received message from stream\n");
-
- msg = osmo_ipa_msg_alloc(0);
- if (msg == NULL) {
- LOGP(DSTREAMTEST, LOGL_ERROR, "cannot allocate message\n");
- return 0;
- }
- if (osmo_stream_srv_recv(conn, msg) <= 0) {
- LOGP(DSTREAMTEST, LOGL_ERROR, "cannot receive message\n");
- osmo_stream_srv_destroy(conn);
+ if (res <= 0) {
+ LOGP(DSTREAMTEST, LOGL_ERROR, "cannot receive message (%d)\n", res);
msgb_free(msg);
- return 0;
- }
- if (osmo_ipa_process_msg(msg) < 0) {
- LOGP(DSTREAMTEST, LOGL_ERROR, "Bad IPA message\n");
- msgb_free(msg);
- return 0;
+ osmo_stream_srv_destroy(conn);
+ return -EBADF;
}
+ LOGP(DSTREAMTEST, LOGL_DEBUG, "received message from stream (payload len=%d)\n", msgb_length(msg));
+
+ osmo_ipa_msg_push_headers(msg, osmo_ipa_msgb_cb_proto(msg), osmo_ipa_msgb_cb_proto_ext(msg));
osmo_stream_srv_send(conn, msg);
return 0;
}
@@ -83,17 +73,20 @@ static int accept_cb(struct osmo_stream_srv_link *srv, int fd)
{
if (conn != NULL) {
LOGP(DSTREAMTEST, LOGL_ERROR, "Sorry, this example only "
- "support one client simultaneously\n");
+ "supports one client simultaneously\n");
return -1;
}
- conn = osmo_stream_srv_create(tall_test, srv, fd,
- read_cb, close_cb, NULL);
+ conn = osmo_stream_srv_create2(tall_test, srv, fd, NULL);
if (conn == NULL) {
LOGP(DSTREAMTEST, LOGL_ERROR,
"error while creating connection\n");
return -1;
}
+ osmo_stream_srv_set_name(conn, "ipa_srv");
+ osmo_stream_srv_set_read_cb(conn, read_cb);
+ osmo_stream_srv_set_closed_cb(conn, close_cb);
+ osmo_stream_srv_set_segmentation_cb(conn, osmo_ipa_segmentation_cb);
return 0;
}
@@ -103,7 +96,7 @@ int main(void)
tall_test = talloc_named_const(NULL, 1, "osmo_stream_srv_test");
msgb_talloc_ctx_init(tall_test, 0);
osmo_init_logging2(tall_test, &osmo_stream_srv_test_log_info);
- log_set_log_level(osmo_stderr_target, LOGL_NOTICE);
+ log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
/*
* initialize stream srv.
diff --git a/examples/osmux-test-input.c b/examples/osmux-test-input.c
index 57e199c..d91ee15 100644
--- a/examples/osmux-test-input.c
+++ b/examples/osmux-test-input.c
@@ -83,11 +83,7 @@ static void osmux_deliver(struct msgb *batch_msg, void *data)
* This is the input handle for osmux. It stores the last osmux sequence that
* has been used and the deliver function that sends the osmux batch.
*/
-struct osmux_in_handle h_input = {
- .osmux_seq = 0, /* sequence number to start OSmux message from */
- .batch_factor = 4, /* batch up to 4 RTP messages */
- .deliver = osmux_deliver,
-};
+struct osmux_in_handle *h_input;
#define MAX_CONCURRENT_CALLS 8
@@ -165,9 +161,9 @@ int read_cb(struct osmo_dgram *conn)
if (ccid < 0)
register_ccid(rtph->ssrc);
- while ((ret = osmux_xfrm_input(&h_input, msg, ccid)) > 0) {
+ while ((ret = osmux_xfrm_input(h_input, msg, ccid)) > 0) {
/* batch full, deliver it */
- osmux_xfrm_input_deliver(&h_input);
+ osmux_xfrm_input_deliver(h_input);
}
if (ret == -1)
printf("something is wrong\n");
@@ -217,7 +213,10 @@ int main(int argc, char *argv[])
/*
* initialize OSMUX handlers.
*/
- osmux_xfrm_input_init(&h_input);
+ h_input = osmux_xfrm_input_alloc(tall_test);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 0);
+ osmux_xfrm_input_set_batch_factor(h_input, 4);
+ osmux_xfrm_input_set_deliver_cb(h_input, osmux_deliver, NULL);
/*
* initialize datagram server.
diff --git a/examples/osmux-test-output.c b/examples/osmux-test-output.c
index 0ab03a7..3f0e5a2 100644
--- a/examples/osmux-test-output.c
+++ b/examples/osmux-test-output.c
@@ -42,7 +42,7 @@ static struct osmo_rtp_handle *rtp;
* This is the output handle for osmux, it stores last RTP sequence and
* timestamp that has been used. There should be one per circuit ID.
*/
-static struct osmux_out_handle h_output;
+static struct osmux_out_handle *h_output;
static int fd;
@@ -107,7 +107,7 @@ int read_cb(struct osmo_dgram *conn)
msg->len, buf);
while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL)
- osmux_xfrm_output_sched(&h_output, osmuxh);
+ osmux_xfrm_output_sched(h_output, osmuxh);
return 0;
}
@@ -117,7 +117,7 @@ void sighandler(int foo)
LOGP(DOSMUX_TEST, LOGL_NOTICE, "closing OSMUX.\n");
osmo_dgram_close(conn);
osmo_dgram_destroy(conn);
- osmux_xfrm_output_flush(&h_output);
+ talloc_free(h_output);
osmo_rtp_handle_free(rtp);
amr_close();
exit(EXIT_SUCCESS);
@@ -155,8 +155,10 @@ int main(int argc, char *argv[])
/*
* initialize OSMUX handlers.
*/
- osmux_xfrm_output_init(&h_output, random());
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, NULL);
+ h_output = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, random());
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, NULL);
/*
* initialize datagram server.
*/
diff --git a/examples/stream-client.c b/examples/stream-client.c
index 428402e..6d20263 100644
--- a/examples/stream-client.c
+++ b/examples/stream-client.c
@@ -3,6 +3,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <netinet/in.h>
#include <osmocom/core/select.h>
#include <osmocom/core/talloc.h>
@@ -31,10 +32,13 @@ const struct log_info osmo_stream_cli_test_log_info = {
static struct osmo_stream_cli *conn;
+static bool quit = false;
+
void sighandler(int foo)
{
LOGP(DSTREAMTEST, LOGL_NOTICE, "closing stream.\n");
- exit(EXIT_SUCCESS);
+ quit = true;
+ signal(SIGINT, SIG_DFL);
}
static int connect_cb(struct osmo_stream_cli *conn)
@@ -50,27 +54,18 @@ static int disconnect_cb(struct osmo_stream_cli *conn)
return 0;
}
-static int read_cb(struct osmo_stream_cli *conn)
+static int read_cb(struct osmo_stream_cli *conn, int res, struct msgb *msg)
{
- int bytes;
- struct msgb *msg;
-
LOGP(DSTREAMTEST, LOGL_NOTICE, "receiving message from stream... ");
- msg = msgb_alloc(1024, "STREAMCLIENT/test");
- if (msg == NULL) {
- LOGPC(DSTREAMTEST, LOGL_ERROR, "cannot allocate message\n");
+ if (res < 0) {
+ LOGPC(DSTREAMTEST, LOGL_ERROR, "cannot receive message (res = %d)\n", res);
+ msgb_free(msg);
return 0;
}
- bytes = osmo_stream_cli_recv(conn, msg);
- if (bytes < 0) {
- LOGPC(DSTREAMTEST, LOGL_ERROR, "cannot receive message\n");
- return 0;
- }
-
- LOGPC(DSTREAMTEST, LOGL_NOTICE, "got %d (%d) bytes: %s\n", bytes, msg->len, msgb_hexdump(msg));
+ LOGPC(DSTREAMTEST, LOGL_NOTICE, "got %d bytes: %s\n", msg->len, msgb_hexdump(msg));
msgb_free(msg);
return 0;
@@ -98,23 +93,48 @@ static int kbd_cb(struct osmo_fd *fd, unsigned int what)
ptr = msgb_put(msg, ret);
memcpy(ptr, buf, ret);
- osmo_stream_cli_send(conn, msg);
+ LOGP(DSTREAMTEST, LOGL_NOTICE, "sending %d bytes message: %s\n", msg->len, msgb_hexdump(msg));
- LOGP(DSTREAMTEST, LOGL_NOTICE, "sent %d bytes message: %s\n", msg->len, msgb_hexdump(msg));
+ osmo_stream_cli_send(conn, msg);
return 0;
}
-int main(void)
+static void signal_handler(int signum)
+{
+ switch (signum) {
+ case SIGUSR1:
+ talloc_report_full(tall_test, stdout);
+ break;
+ }
+}
+
+int main(int argc, char **argv)
{
struct osmo_fd *kbd_ofd;
- int rc;
+ bool use_sctp = false;
+ const char *use_remote_addr = "127.0.0.1";
+ int opt, rc;
+
+ while ((opt = getopt(argc, argv, "sr:")) != -1) {
+ switch (opt) {
+ case 's':
+ use_sctp = true;
+ break;
+ case 'r':
+ use_remote_addr = optarg;
+ break;
+ default:
+ exit(0);
+ }
+ }
+
+ signal(SIGUSR1, &signal_handler);
tall_test = talloc_named_const(NULL, 1, "osmo_stream_cli_test");
msgb_talloc_ctx_init(tall_test, 0);
osmo_init_logging2(tall_test, &osmo_stream_cli_test_log_info);
- log_set_log_level(osmo_stderr_target, 1);
- log_set_category_filter(osmo_stderr_target, DLINP, 0, LOGL_INFO);
+ log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
/*
* initialize stream cli.
@@ -125,14 +145,18 @@ int main(void)
fprintf(stderr, "cannot create cli\n");
exit(EXIT_FAILURE);
}
- osmo_stream_cli_set_addr(conn, "127.0.0.1");
+ osmo_stream_cli_set_name(conn, "stream_client");
+ osmo_stream_cli_set_addr(conn, use_remote_addr);
osmo_stream_cli_set_port(conn, 10000);
+ if (use_sctp)
+ osmo_stream_cli_set_proto(conn, IPPROTO_SCTP);
osmo_stream_cli_set_connect_cb(conn, connect_cb);
osmo_stream_cli_set_disconnect_cb(conn, disconnect_cb);
- osmo_stream_cli_set_read_cb(conn, read_cb);
+ osmo_stream_cli_set_read_cb2(conn, read_cb);
- if (osmo_stream_cli_open(conn) < 0) {
- fprintf(stderr, "cannot open cli\n");
+ rc = osmo_stream_cli_open(conn);
+ if (rc < 0) {
+ fprintf(stderr, "cannot open cli: %d\n", rc);
exit(EXIT_FAILURE);
}
@@ -148,9 +172,15 @@ int main(void)
exit(EXIT_FAILURE);
}
+ signal(SIGINT, sighandler);
+
LOGP(DSTREAMTEST, LOGL_NOTICE, "Entering main loop\n");
- while(1) {
+ while (!quit) {
osmo_select_main(0);
}
+
+ osmo_fd_unregister(kbd_ofd);
+
+ osmo_stream_cli_destroy(conn);
}
diff --git a/examples/stream-server.c b/examples/stream-server.c
index e4ca480..5295c2b 100644
--- a/examples/stream-server.c
+++ b/examples/stream-server.c
@@ -3,6 +3,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
+#include <errno.h>
#include <osmocom/core/select.h>
#include <osmocom/core/socket.h>
@@ -35,36 +36,30 @@ const struct log_info osmo_stream_srv_test_log_info = {
static struct osmo_stream_srv_link *srv;
static struct osmo_stream_srv *conn;
+bool quit = false;
void sighandler(int foo)
{
LOGP(DSTREAMTEST, LOGL_NOTICE, "closing STREAMSERVER.\n");
- exit(EXIT_SUCCESS);
+ quit = true;
+ signal(SIGINT, SIG_DFL);
}
-int read_cb(struct osmo_stream_srv *conn)
+int read_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg)
{
- int bytes;
- struct msgb *msg;
-
LOGP(DSTREAMTEST, LOGL_NOTICE, "receiving message from stream... ");
- msg = msgb_alloc(1024, "STREAMSERVER/test");
- if (msg == NULL) {
- LOGPC(DSTREAMTEST, LOGL_ERROR, "cannot allocate message\n");
- return 0;
- }
-
- bytes = osmo_stream_srv_recv(conn, msg);
-
- if (bytes <= 0) {
- if (bytes < 0)
- LOGPC(DSTREAMTEST, LOGL_ERROR, "cannot receive message: %s\n", strerror(-bytes));
+ if (res <= 0) {
+ if (res < 0)
+ LOGPC(DSTREAMTEST, LOGL_ERROR, "cannot receive message: %s\n", strerror(-res));
else
LOGPC(DSTREAMTEST, LOGL_ERROR, "client closed connection\n");
+ msgb_free(msg);
osmo_stream_srv_destroy(conn);
- } else
- LOGPC(DSTREAMTEST, LOGL_NOTICE, "got %d (%d) bytes: %s\n", bytes, msg->len, msgb_hexdump(msg));
+ return -EBADF;
+ }
+
+ LOGPC(DSTREAMTEST, LOGL_NOTICE, "got %d bytes: %s\n", msg->len, msgb_hexdump(msg));
msgb_free(msg);
return 0;
@@ -72,6 +67,7 @@ int read_cb(struct osmo_stream_srv *conn)
static int close_cb(struct osmo_stream_srv *dummy)
{
+ LOGPC(DSTREAMTEST, LOGL_ERROR, "client closed connection\n");
conn = NULL;
return 0;
}
@@ -86,13 +82,15 @@ static int accept_cb(struct osmo_stream_srv_link *srv, int fd)
return -1;
}
- conn = osmo_stream_srv_create(tall_test, srv, fd, read_cb,
- close_cb, NULL);
+ conn = osmo_stream_srv_create2(tall_test, srv, fd, NULL);
if (conn == NULL) {
LOGP(DSTREAMTEST, LOGL_ERROR,
"error while creating connection\n");
return -1;
}
+ osmo_stream_srv_set_name(conn, "stream_server");
+ osmo_stream_srv_set_read_cb(conn, read_cb);
+ osmo_stream_srv_set_closed_cb(conn, close_cb);
osmo_sock_get_name_buf(buf, OSMO_SOCK_NAME_MAXLEN, fd);
LOGP(DSTREAMTEST, LOGL_NOTICE, "accepted client: %s\n", buf);
@@ -127,20 +125,46 @@ static int kbd_cb(struct osmo_fd *fd, unsigned int what)
memcpy(ptr, buf, ret);
osmo_stream_srv_send(conn, msg);
- LOGP(DSTREAMTEST, LOGL_NOTICE, "message of %d bytes sent\n", msg->len);
+ LOGP(DSTREAMTEST, LOGL_NOTICE, "message of %d bytes sent\n", ret);
return 0;
}
-int main(void)
+static void signal_handler(int signum)
+{
+ switch (signum) {
+ case SIGUSR1:
+ talloc_report(tall_test, stderr);
+ break;
+ }
+}
+
+int main(int argc, char **argv)
{
struct osmo_fd *kbd_ofd;
+ bool use_sctp = false;
+ const char *use_local_addr = "127.0.0.1";
+ int opt;
+
+ while ((opt = getopt(argc, argv, "sl:")) != -1) {
+ switch (opt) {
+ case 's':
+ use_sctp = true;
+ break;
+ case 'l':
+ use_local_addr = optarg;
+ break;
+ default:
+ exit(0);
+ }
+ }
+
+ signal(SIGUSR1, &signal_handler);
tall_test = talloc_named_const(NULL, 1, "osmo_stream_srv_test");
msgb_talloc_ctx_init(tall_test, 0);
osmo_init_logging2(tall_test, &osmo_stream_srv_test_log_info);
- log_set_log_level(osmo_stderr_target, 1);
- log_set_category_filter(osmo_stderr_target, DLINP, 0, LOGL_INFO);
+ log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
/*
* initialize stream srv.
@@ -151,8 +175,10 @@ int main(void)
fprintf(stderr, "cannot create server link\n");
exit(EXIT_FAILURE);
}
- osmo_stream_srv_link_set_addr(srv, "127.0.0.1");
+ osmo_stream_srv_link_set_addr(srv, use_local_addr);
osmo_stream_srv_link_set_port(srv, 10000);
+ if (use_sctp)
+ osmo_stream_srv_link_set_proto(srv, IPPROTO_SCTP);
osmo_stream_srv_link_set_accept_cb(srv, accept_cb);
if (osmo_stream_srv_link_open(srv) < 0) {
@@ -168,9 +194,15 @@ int main(void)
osmo_fd_setup(kbd_ofd, STDIN_FILENO, OSMO_FD_READ, kbd_cb, srv, 0);
osmo_fd_register(kbd_ofd);
+ signal(SIGINT, sighandler);
+
LOGP(DSTREAMTEST, LOGL_NOTICE, "Entering main loop on %s\n", osmo_stream_srv_link_get_sockname(srv));
- while(1) {
+ while (!quit) {
osmo_select_main(0);
}
+
+ osmo_fd_unregister(kbd_ofd);
+
+ osmo_stream_srv_link_destroy(srv);
}
diff --git a/include/osmocom/netif/Makefile.am b/include/osmocom/netif/Makefile.am
index 39df08a..3d8a56b 100644
--- a/include/osmocom/netif/Makefile.am
+++ b/include/osmocom/netif/Makefile.am
@@ -1,11 +1,20 @@
+noinst_HEADERS = \
+ stream_private.h \
+ $(NULL)
+
osmonetif_HEADERS = amr.h \
datagram.h \
jibuf.h \
osmux.h \
ipa.h \
ipa_unit.h \
+ prim.h \
rs232.h \
rtp.h \
stream.h
+if ENABLE_LIBSCTP
+osmonetif_HEADERS += sctp.h
+endif
+
osmonetifdir = $(includedir)/osmocom/netif
diff --git a/include/osmocom/netif/amr.h b/include/osmocom/netif/amr.h
index c5a8e28..a4d3da2 100644
--- a/include/osmocom/netif/amr.h
+++ b/include/osmocom/netif/amr.h
@@ -1,6 +1,10 @@
#ifndef _OSMO_AMR_H_
#define _OSMO_AMR_H_
+#include <stddef.h>
+#include <stdbool.h>
+#include <stdint.h>
+
#include <osmocom/core/endian.h>
/* As defined by RFC3267: Adaptive Multi-Rate (AMR) */
@@ -12,6 +16,37 @@
*/
/*
+ * 4.3. Bandwidth-Efficient Mode:
+ *
+ * Summary from 4.3.4: Same as Octet aligned (see below) but without padding after header and ToC:
+ * 0 1
+ * 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | CMR |F| FT |Q|X X X X X X|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ * X means AMR payload (padding in case of FT=NO_DATA).
+ */
+struct amr_hdr_bwe {
+#if OSMO_IS_LITTLE_ENDIAN
+ uint8_t ft_hi:3, /* coding mode highest part */
+ f:1,
+ cmr:4; /* Codec Mode Request */
+ uint8_t data_start:6,
+ q:1, /* OK (not damaged) at origin? */
+ ft_lo:1; /* coding mode lowest bit */
+#elif OSMO_IS_BIG_ENDIAN
+/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
+ uint8_t cmr:4, f:1, ft_hi:3;
+ uint8_t ft_lo:1, q:1, data_start:6;
+#endif
+ uint8_t data[0];
+} __attribute__((packed));
+
+/* See diagram above: CMR (4) + F (1) + FT (4) + Q (1) = 10 */
+#define AMR_HDR_BWE_LEN_BITS 10
+
+/*
* 4.4. Octet-aligned Mode:
*
* 4.4.1. The Payload Header:
@@ -53,10 +88,11 @@ struct amr_hdr {
ft:4, /* coding mode */
f:1; /* followed by another speech frame? */
#elif OSMO_IS_BIG_ENDIAN
-/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
+/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
uint8_t cmr:4, pad1:4;
uint8_t f:1, ft:4, q:1, pad2:2;
#endif
+ uint8_t data[0];
} __attribute__((packed));
static inline void *osmo_amr_get_payload(struct amr_hdr *amrh)
@@ -67,52 +103,72 @@ static inline void *osmo_amr_get_payload(struct amr_hdr *amrh)
/* AMR voice frame type identifiers
* See also 3GPP TS 26.101, Table 1a: Interpretation of Frame Type, Mode
* Indication and Mode Request fields */
-#define AMR_FT_0 0 /* 4.75 */
-#define AMR_FT_1 1 /* 5.15 */
-#define AMR_FT_2 2 /* 5.90 */
-#define AMR_FT_3 3 /* 6.70 */
-#define AMR_FT_4 4 /* 7.40 */
-#define AMR_FT_5 5 /* 7.95 */
-#define AMR_FT_6 6 /* 10.2 */
-#define AMR_FT_7 7 /* 12.2 */
-#define AMR_FT_SID 8 /* SID */
-#define AMR_FT_MAX 9
+#define AMR_FT_0 0 /* 4.75 */
+#define AMR_FT_1 1 /* 5.15 */
+#define AMR_FT_2 2 /* 5.90 */
+#define AMR_FT_3 3 /* 6.70 */
+#define AMR_FT_4 4 /* 7.40 */
+#define AMR_FT_5 5 /* 7.95 */
+#define AMR_FT_6 6 /* 10.2 */
+#define AMR_FT_7 7 /* 12.2 */
+#define AMR_FT_SID 8 /* AMR SID */
+#define AMR_FT_GSM_EFR_SID 9 /* GSM-EFR SID */
+#define AMR_FT_TDMA_EFR_SID 10 /* TDMA-EFR SID */
+#define AMR_FT_PDC_EFR_SID 11 /* PDC-EFR SID */
+/* version 16.0.0 Release 16: 12-14 for future use */
+#define AMR_FT_NO_DATA 15 /* NO_DATA */
+#define AMR_FT_MAX 16 /* INTERNAL, NO NOT USE OUTSIDE libosmo-netif */
/* AMR voice frame length (in bits).
* See also RFC 3267, chapter 3.6.
*
* NOTE: These constants refer to the length of one AMR speech frame-block,
* not counting CMR, TOC. */
-#define AMR_FT_0_LEN_BITS 95 /* 4.75 */
-#define AMR_FT_1_LEN_BITS 103 /* 5.15 */
-#define AMR_FT_2_LEN_BITS 118 /* 5.90 */
-#define AMR_FT_3_LEN_BITS 134 /* 6.70 */
-#define AMR_FT_4_LEN_BITS 148 /* 7.40 */
-#define AMR_FT_5_LEN_BITS 159 /* 7.95 */
-#define AMR_FT_6_LEN_BITS 204 /* 10.2 */
-#define AMR_FT_7_LEN_BITS 244 /* 12.2 */
-#define AMR_FT_SID_LEN_BITS 39 /* SID */
+#define AMR_FT_0_LEN_BITS 95 /* 4.75 */
+#define AMR_FT_1_LEN_BITS 103 /* 5.15 */
+#define AMR_FT_2_LEN_BITS 118 /* 5.90 */
+#define AMR_FT_3_LEN_BITS 134 /* 6.70 */
+#define AMR_FT_4_LEN_BITS 148 /* 7.40 */
+#define AMR_FT_5_LEN_BITS 159 /* 7.95 */
+#define AMR_FT_6_LEN_BITS 204 /* 10.2 */
+#define AMR_FT_7_LEN_BITS 244 /* 12.2 */
+#define AMR_FT_SID_LEN_BITS 39 /* SID */
+#define AMR_FT_GSM_EFR_SID_LEN_BITS 43 /* GSM-EFR SID */
+#define AMR_FT_TDMA_EFR_SID_LEN_BITS 38 /* TDMA-EFR SID */
+#define AMR_FT_PDC_EFR_SID_LEN_BITS 37 /* PDC-EFR SID */
+/* version 16.0.0 Release 16: 12-14 for future use */
+#define AMR_FT_NO_DATA_LEN_BITS 0 /* NO_DATA */
/* AMR voice frame length (in bytes, rounded).
*
* NOTE: These constants refer to the length of one AMR speech frame-block,
* not counting CMR, TOC. */
-#define AMR_FT_0_LEN ((AMR_FT_0_LEN_BITS+7)/8) /* 4.75 */
-#define AMR_FT_1_LEN ((AMR_FT_1_LEN_BITS+7)/8) /* 5.15 */
-#define AMR_FT_2_LEN ((AMR_FT_2_LEN_BITS+7)/8) /* 5.90 */
-#define AMR_FT_3_LEN ((AMR_FT_3_LEN_BITS+7)/8) /* 6.70 */
-#define AMR_FT_4_LEN ((AMR_FT_4_LEN_BITS+7)/8) /* 7.40 */
-#define AMR_FT_5_LEN ((AMR_FT_5_LEN_BITS+7)/8) /* 7.95 */
-#define AMR_FT_6_LEN ((AMR_FT_6_LEN_BITS+7)/8) /* 10.2 */
-#define AMR_FT_7_LEN ((AMR_FT_7_LEN_BITS+7)/8) /* 12.2 */
-#define AMR_FT_SID_LEN ((AMR_FT_SID_LEN_BITS+7)/8) /* SID */
+#define AMR_FT_0_LEN ((AMR_FT_0_LEN_BITS+7)/8) /* 4.75 */
+#define AMR_FT_1_LEN ((AMR_FT_1_LEN_BITS+7)/8) /* 5.15 */
+#define AMR_FT_2_LEN ((AMR_FT_2_LEN_BITS+7)/8) /* 5.90 */
+#define AMR_FT_3_LEN ((AMR_FT_3_LEN_BITS+7)/8) /* 6.70 */
+#define AMR_FT_4_LEN ((AMR_FT_4_LEN_BITS+7)/8) /* 7.40 */
+#define AMR_FT_5_LEN ((AMR_FT_5_LEN_BITS+7)/8) /* 7.95 */
+#define AMR_FT_6_LEN ((AMR_FT_6_LEN_BITS+7)/8) /* 10.2 */
+#define AMR_FT_7_LEN ((AMR_FT_7_LEN_BITS+7)/8) /* 12.2 */
+#define AMR_FT_SID_LEN ((AMR_FT_SID_LEN_BITS+7)/8) /* SID */
+#define AMR_FT_GSM_EFR_SID_LEN ((AMR_FT_GSM_EFR_SID_LEN_BITS+7)/8) /* GSM-EFR SID */
+#define AMR_FT_TDMA_EFR_SID_LEN ((AMR_FT_TDMA_EFR_SID_LEN_BITS+7)/8) /* TDMA-EFR SID */
+#define AMR_FT_PDC_EFR_SID_LEN ((AMR_FT_PDC_EFR_SID_LEN_BITS+7)/8) /* PDC-EFR SID */
+/* version 16.0.0 Release 16: 12-14 for future use */
+#define AMR_FT_NO_DATA_LEN ((AMR_FT_NO_DATA_LEN_BITS+7)/8) /* NO_DATA */
int osmo_amr_ft_valid(uint8_t amr_ft);
size_t osmo_amr_bytes(uint8_t amr_cmr);
+size_t osmo_amr_bits(uint8_t amr_ft);
-bool osmo_amr_is_oa(uint8_t *payload, unsigned int payload_len);
+bool osmo_amr_is_oa(const uint8_t *payload, unsigned int payload_len);
int osmo_amr_oa_to_bwe(uint8_t *payload, unsigned int payload_len);
int osmo_amr_bwe_to_oa(uint8_t *payload, unsigned int payload_len,
unsigned int payload_maxlen);
+int osmo_amr_bwe_to_iuup(uint8_t *payload, unsigned int payload_len);
+int osmo_amr_iuup_to_bwe(uint8_t *payload, unsigned int payload_len,
+ unsigned int payload_maxlen);
+int osmo_amr_bytes_to_ft(size_t bytes);
#endif
diff --git a/include/osmocom/netif/datagram.h b/include/osmocom/netif/datagram.h
index a0ff7b4..a9bc588 100644
--- a/include/osmocom/netif/datagram.h
+++ b/include/osmocom/netif/datagram.h
@@ -1,6 +1,19 @@
#ifndef _OSMO_DGRAM_H_
#define _OSMO_DGRAM_H_
+/*! \defgroup datagram Osmocom Datagram Socket
+ * @{
+ *
+ * This code is intended to abstract any use of datagram type sockets,
+ * such as UDP. It offers both transmitter and receiver side
+ * implementations, fully integrated with the libosmocore select loop
+ * abstraction.
+ */
+
+/*! \file datagram.h
+ * \brief Osmocom datagram socket helpers
+ */
+
struct osmo_dgram_tx;
struct osmo_dgram_tx *osmo_dgram_tx_create(void *ctx);
diff --git a/include/osmocom/netif/ipa.h b/include/osmocom/netif/ipa.h
index 0d1085f..038b9ac 100644
--- a/include/osmocom/netif/ipa.h
+++ b/include/osmocom/netif/ipa.h
@@ -18,7 +18,30 @@ struct ipa_head_ext {
uint8_t data[0];
} __attribute__ ((packed));
+struct osmo_ipa_msgb_cb {
+ uint8_t proto;
+ uint8_t proto_ext;
+} __attribute__ ((packed));
+
+
+/* We don't just cast to 'struct osmo_ipa_msgb_cb *', because that would
+ * break the strict aliasing rule. Casting to a reference to a union with
+ * a compatible struct member seems to be allowed, though, see:
+ * N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x,
+ * Section 6.5, §7 */
+#define OSMO_IPA_MSGB_CB(__msg) (&((( \
+ union { \
+ unsigned long cb; \
+ struct osmo_ipa_msgb_cb _cb; \
+ } \
+ *)&((__msg)->cb[0]))->_cb))
+
+#define osmo_ipa_msgb_cb_proto(__x) OSMO_IPA_MSGB_CB(__x)->proto
+#define osmo_ipa_msgb_cb_proto_ext(__x) OSMO_IPA_MSGB_CB(__x)->proto_ext
+
struct msgb *osmo_ipa_msg_alloc(int headroom);
+struct msgb *osmo_ipa_ext_msg_alloc(size_t headroom);
+
void osmo_ipa_msg_push_header(struct msgb *msg, uint8_t proto);
int osmo_ipa_process_msg(struct msgb *msg);
@@ -40,4 +63,8 @@ struct msgb *ipa_cli_id_ack(void);
int osmo_ipa_parse_msg_id_resp(struct msgb *msg, struct ipaccess_unit *unit_data);
+int osmo_ipa_segmentation_cb(struct msgb *msg);
+
+void osmo_ipa_msg_push_headers(struct msgb *msg, enum ipaccess_proto p, enum ipaccess_proto_ext pe);
+
#endif
diff --git a/include/osmocom/netif/osmux.h b/include/osmocom/netif/osmux.h
index 6305dc8..8a8bf88 100644
--- a/include/osmocom/netif/osmux.h
+++ b/include/osmocom/netif/osmux.h
@@ -3,6 +3,7 @@
#include <osmocom/core/endian.h>
#include <osmocom/core/timer.h>
+#include <osmocom/core/msgb.h>
/*! \addtogroup osmux
* @{
@@ -12,7 +13,10 @@
* Osmocom multiplex protocol helpers
*/
-/* OSmux header:
+#define OSMUX_DEFAULT_PORT 1984
+
+/*! \struct osmux_hdr
+ * OSmux header:
*
* rtp_m (1 bit): RTP M field (RFC3550, RFC4867)
* ft (2 bits): 0=signalling, 1=voice, 2=dummy
@@ -29,6 +33,7 @@
#define OSMUX_FT_VOICE_AMR 1
#define OSMUX_FT_DUMMY 2
+/*! Osmux protocol header */
struct osmux_hdr {
#if OSMO_IS_LITTLE_ENDIAN
uint8_t amr_q:1,
@@ -37,7 +42,7 @@ struct osmux_hdr {
ft:2,
rtp_m:1;
#elif OSMO_IS_BIG_ENDIAN
-/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
+/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
uint8_t rtp_m:1, ft:2, ctr:3, amr_f:1, amr_q:1;
#endif
uint8_t seq;
@@ -47,13 +52,15 @@ struct osmux_hdr {
uint8_t amr_cmr:4,
amr_ft:4;
#elif OSMO_IS_BIG_ENDIAN
-/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
+/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
uint8_t amr_ft:4, amr_cmr:4;
#endif
+ uint8_t data[0];
} __attribute__((packed));
-/* one to handle all existing RTP flows */
+/*! one to handle all existing RTP flows */
struct osmux_in_handle {
+ /*! Initial Osmux seqnum for each circuit, set during osmux_xfrm_input_open_circuit() */
uint8_t osmux_seq;
uint8_t batch_factor;
uint16_t batch_size;
@@ -72,7 +79,9 @@ struct osmux_in_handle {
#define OSMUX_MAX_CONCURRENT_CALLS 8
-/* one per OSmux circuit_id, ie. one per RTP flow. */
+typedef struct msgb *(*rtp_msgb_alloc_cb_t)(void *rtp_msgb_alloc_priv_data,
+ unsigned int msg_len);
+/*! one per OSmux circuit_id, ie. one per RTP flow. */
struct osmux_out_handle {
uint16_t rtp_seq;
uint32_t rtp_timestamp;
@@ -83,8 +92,11 @@ struct osmux_out_handle {
struct llist_head list;
void (*tx_cb)(struct msgb *msg, void *data); /* Used defined rtp tx callback */
void *data; /* User defined opaque data structure */
+ rtp_msgb_alloc_cb_t rtp_msgb_alloc_cb; /* User defined msgb alloc function for generated RTP pkts */
+ void *rtp_msgb_alloc_cb_data; /* Opaque data pointer set by user and passed in rtp_msgb_alloc_cb() */
};
+/*! return pointer to osmux payload (behind osmux_hdr) */
static inline uint8_t *osmux_get_payload(struct osmux_hdr *osmuxh)
{
return (uint8_t *)osmuxh + sizeof(struct osmux_hdr);
@@ -95,8 +107,15 @@ int osmux_snprintf(char *buf, size_t size, struct msgb *msg);
/* 1500 - sizeof(iphdr) = 20 bytes - sizeof(udphdr) = 8 bytes. */
#define OSMUX_BATCH_DEFAULT_MAX 1472
-void osmux_xfrm_input_init(struct osmux_in_handle *h);
-void osmux_xfrm_input_fini(struct osmux_in_handle *h);
+struct osmux_in_handle *osmux_xfrm_input_alloc(void *ctx);
+void osmux_xfrm_input_init(struct osmux_in_handle *h) OSMO_DEPRECATED("Use osmux_xfrm_input_alloc() instead");
+void osmux_xfrm_input_fini(struct osmux_in_handle *h) OSMO_DEPRECATED("Use talloc_free() instead");
+void osmux_xfrm_input_set_name(struct osmux_in_handle *h, const char *name);
+int osmux_xfrm_input_set_batch_factor(struct osmux_in_handle *h, uint8_t batch_factor);
+void osmux_xfrm_input_set_batch_size(struct osmux_in_handle *h, uint16_t batch_size);
+void osmux_xfrm_input_set_initial_seqnum(struct osmux_in_handle *h, uint8_t osmux_seqnum);
+void osmux_xfrm_input_set_deliver_cb(struct osmux_in_handle *h, void (*deliver_cb)(struct msgb *msg, void *data), void *data);
+void *osmux_xfrm_input_get_deliver_cb_data(struct osmux_in_handle *h);
int osmux_xfrm_input_open_circuit(struct osmux_in_handle *h, int ccid, int dummy);
void osmux_xfrm_input_close_circuit(struct osmux_in_handle *h, int ccid);
@@ -104,16 +123,16 @@ void osmux_xfrm_input_close_circuit(struct osmux_in_handle *h, int ccid);
int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg, int ccid);
void osmux_xfrm_input_deliver(struct osmux_in_handle *h);
-void osmux_xfrm_output_init(struct osmux_out_handle *h, uint32_t rtp_ssrc) OSMO_DEPRECATED("Use osmux_xfrm_output_init2() instead");
-void osmux_xfrm_output_init2(struct osmux_out_handle *h, uint32_t rtp_ssrc, uint8_t rtp_payload_type);
+struct osmux_out_handle *osmux_xfrm_output_alloc(void *ctx);
+void osmux_xfrm_output_init(struct osmux_out_handle *h, uint32_t rtp_ssrc) OSMO_DEPRECATED("Use osmux_xfrm_output_alloc() and osmux_xfrm_output_set_rtp_*() instead");
+void osmux_xfrm_output_init2(struct osmux_out_handle *h, uint32_t rtp_ssrc, uint8_t rtp_payload_type) OSMO_DEPRECATED("Use osmux_xfrm_output_alloc() and osmux_xfrm_output_set_rtp_*() instead");
+void osmux_xfrm_output_set_rtp_ssrc(struct osmux_out_handle *h, uint32_t rtp_ssrc);
+void osmux_xfrm_output_set_rtp_pl_type(struct osmux_out_handle *h, uint32_t rtp_payload_type);
void osmux_xfrm_output_set_tx_cb(struct osmux_out_handle *h, void (*tx_cb)(struct msgb *msg, void *data), void *data);
-int osmux_xfrm_output(struct osmux_hdr *osmuxh, struct osmux_out_handle *h, struct llist_head *list) OSMO_DEPRECATED("Use osmux_xfrm_output_sched() instead");
+void osmux_xfrm_output_set_rtp_msgb_alloc_cb(struct osmux_out_handle *h, rtp_msgb_alloc_cb_t cb, void *cb_data);
int osmux_xfrm_output_sched(struct osmux_out_handle *h, struct osmux_hdr *osmuxh);
void osmux_xfrm_output_flush(struct osmux_out_handle *h);
struct osmux_hdr *osmux_xfrm_output_pull(struct msgb *msg);
-
-void osmux_tx_sched(struct llist_head *list, void (*tx_cb)(struct msgb *msg, void *data), void *data) OSMO_DEPRECATED("Use osmux_xfrm_output_set_tx_cb() instead");
-
/*! @} */
#endif
diff --git a/include/osmocom/netif/prim.h b/include/osmocom/netif/prim.h
new file mode 100644
index 0000000..d26e220
--- /dev/null
+++ b/include/osmocom/netif/prim.h
@@ -0,0 +1,66 @@
+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/lienses/>.
+ *
+ */
+#pragma once
+
+#include <stdint.h>
+
+#include <osmocom/core/prim.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/linuxlist.h>
+
+struct osmo_prim_srv_link;
+struct osmo_prim_srv;
+
+typedef int (*osmo_prim_srv_conn_cb)(struct osmo_prim_srv *prim_srv);
+/*! oph and related msgb is owned by srv and wll be freed after the callback returns. */
+typedef int (*osmo_prim_srv_rx_cb)(struct osmo_prim_srv *prim_srv, struct osmo_prim_hdr *oph);
+
+/*! Return value:
+ * RET=rem_version: Accept the version
+ * RET!=rem_version && RET > 0: Reject the requested version but propose another candidate version
+ * In this case, the client can decide whether to request another VER
+ * or close the connection.
+ * RET<0: Reject the proposed version and close the connection.
+ */
+typedef int (*osmo_prim_srv_rx_sapi_version)(struct osmo_prim_srv *prim_srv, uint32_t sapi, uint16_t rem_version);
+
+struct osmo_prim_hdr *osmo_prim_msgb_alloc(unsigned int sap, unsigned int primitive,
+ enum osmo_prim_operation operation, size_t alloc_len);
+
+struct osmo_prim_srv_link *osmo_prim_srv_link_alloc(void *ctx);
+void osmo_prim_srv_link_free(struct osmo_prim_srv_link *prim_link);
+void osmo_prim_srv_link_set_name(struct osmo_prim_srv_link *prim_link, const char *name);
+int osmo_prim_srv_link_set_addr(struct osmo_prim_srv_link *prim_link, const char *path);
+const char *osmo_prim_srv_link_get_addr(struct osmo_prim_srv_link *prim_link);
+void osmo_prim_srv_link_set_priv(struct osmo_prim_srv_link *prim_link, void *priv);
+void *osmo_prim_srv_link_get_priv(const struct osmo_prim_srv_link *prim_link);
+void osmo_prim_srv_link_set_log_category(struct osmo_prim_srv_link *prim_link, int log_cat);
+void osmo_prim_srv_link_set_opened_conn_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_conn_cb opened_conn_cb);
+void osmo_prim_srv_link_set_closed_conn_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_conn_cb closed_conn_cb);
+void osmo_prim_srv_link_set_rx_sapi_version_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_rx_sapi_version rx_sapi_version_cb);
+void osmo_prim_srv_link_set_rx_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_rx_cb rx_cb);
+void osmo_prim_srv_link_set_rx_msgb_alloc_len(struct osmo_prim_srv_link *prim_link, size_t alloc_len);
+int osmo_prim_srv_link_open(struct osmo_prim_srv_link *prim_link);
+
+int osmo_prim_srv_send(struct osmo_prim_srv *prim_srv, struct msgb *msg);
+struct osmo_prim_srv_link *osmo_prim_srv_get_link(struct osmo_prim_srv *prims_srv);
+void osmo_prim_srv_set_name(struct osmo_prim_srv *prim_srv, const char *name);
+void osmo_prim_srv_set_priv(struct osmo_prim_srv *prim_srv, void *priv);
+void *osmo_prim_srv_get_priv(const struct osmo_prim_srv *prim_srv);
+void osmo_prim_srv_close(struct osmo_prim_srv *prim_srv);
diff --git a/include/osmocom/netif/rtp.h b/include/osmocom/netif/rtp.h
index 4e40745..7f5ecae 100644
--- a/include/osmocom/netif/rtp.h
+++ b/include/osmocom/netif/rtp.h
@@ -13,7 +13,7 @@ struct rtp_hdr {
uint8_t payload_type:7,
marker:1;
#elif OSMO_IS_BIG_ENDIAN
-/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianess.py) */
+/* auto-generated from the little endian part above (libosmocore/contrib/struct_endianness.py) */
uint8_t version:2, padding:1, extension:1, csrc_count:4;
uint8_t marker:1, payload_type:7;
#endif
@@ -82,4 +82,6 @@ int osmo_rtp_snprintf(char *buf, size_t size, struct msgb *msg);
#define RTP_PT_AMR 98
+#define RTP_PT_CSDATA 120 /* 3GPP TS 48.103 table 5.4.2.2.1 */
+
#endif
diff --git a/include/osmocom/netif/sctp.h b/include/osmocom/netif/sctp.h
new file mode 100644
index 0000000..9dcb6dd
--- /dev/null
+++ b/include/osmocom/netif/sctp.h
@@ -0,0 +1,60 @@
+#pragma once
+
+#include <osmocom/core/utils.h>
+
+/* Relevant SCTP RFCs:
+ * rfc9260 (obsoletes rfc4960): SCTP protocol
+ * rfc5061: SCTP Dynamic Address Reconfiguration
+ * rfc6458: SCTP Sockets API Extensions
+ */
+
+enum sctp_sac_state;
+extern const struct value_string osmo_sctp_assoc_chg_strs[];
+static inline const char *osmo_sctp_assoc_chg_str(enum sctp_sac_state val)
+{ return get_value_string(osmo_sctp_assoc_chg_strs, val); }
+
+enum sctp_spc_state;
+extern const struct value_string osmo_sctp_paddr_chg_strs[];
+static inline const char *osmo_sctp_paddr_chg_str(enum sctp_spc_state val)
+{ return get_value_string(osmo_sctp_paddr_chg_strs, val); }
+
+enum sctp_sn_type;
+extern const struct value_string osmo_sctp_sn_type_strs[];
+static inline const char *osmo_sctp_sn_type_str(enum sctp_sn_type val)
+{ return get_value_string(osmo_sctp_sn_type_strs, val); }
+
+enum sctp_sn_error;
+extern const struct value_string osmo_sctp_sn_error_strs[];
+static inline const char *osmo_sctp_sn_error_str(enum sctp_sn_error val)
+{ return get_value_string(osmo_sctp_sn_error_strs, val); }
+
+enum osmo_sctp_op_error {
+ OSMO_SCTP_OP_ERR_INVALID_STREAM_ID = 1,
+ OSMO_SCTP_OP_ERR_MISS_MAND_PARAM = 2,
+ OSMO_SCTP_OP_ERR_STALE_COOKIE = 3,
+ OSMO_SCTP_OP_ERR_NO_RESOURCES = 4,
+ OSMO_SCTP_OP_ERR_UNRESOLV_ADDR = 5,
+ OSMO_SCTP_OP_ERR_UNKN_CHUNK_TYPE = 6,
+ OSMO_SCTP_OP_ERR_INVALID_MAND_PARAM = 7,
+ OSMO_SCTP_OP_ERR_UNKN_PARAM = 8,
+ OSMO_SCTP_OP_ERR_NO_USER_DATA = 9,
+ OSMO_SCTP_OP_ERR_COOKIE_RX_WHILE_SHUTDOWN = 10,
+ OSMO_SCTP_OP_ERR_RESTART_ASSC_NEW_ADDR = 11,
+ OSMO_SCTP_OP_ERR_UNER_INITED_ABORT = 12,
+ OSMO_SCTP_OP_ERR_PROTO_VERSION = 13,
+};
+
+
+extern const struct value_string osmo_sctp_op_error_strs[];
+static inline const char *osmo_sctp_op_error_str(enum osmo_sctp_op_error val)
+{ return get_value_string(osmo_sctp_op_error_strs, val); }
+
+enum sctp_spinfo_state;
+extern const struct value_string osmo_sctp_spinfo_state_strs[];
+static inline const char *osmo_sctp_spinfo_state_str(enum sctp_spinfo_state val)
+{ return get_value_string(osmo_sctp_spinfo_state_strs, val); }
+
+enum sctp_sstat_state;
+extern const struct value_string osmo_sctp_sstat_state_strs[];
+static inline const char *osmo_sctp_sstat_state_str(enum sctp_sstat_state val)
+{ return get_value_string(osmo_sctp_sstat_state_strs, val); }
diff --git a/include/osmocom/netif/stream.h b/include/osmocom/netif/stream.h
index 331dec1..3c4ec7e 100644
--- a/include/osmocom/netif/stream.h
+++ b/include/osmocom/netif/stream.h
@@ -2,61 +2,201 @@
#include <stdbool.h>
#include <stdint.h>
+#include <unistd.h>
#include <osmocom/core/msgb.h>
-/*! \addtogroup stream
- * @{
- */
+/*! \file stream.h */
+
+/*! \brief Access SCTP flags from the msgb control buffer */
+#define OSMO_STREAM_SCTP_MSG_FLAGS_NOTIFICATION 0x80 /* sctp_recvmsg() flags=MSG_NOTIFICATION, msgb_data() contains "union sctp_notification*" */
+#define msgb_sctp_msg_flags(msg) (msg)->cb[2]
/*! \brief Access the SCTP PPID from the msgb control buffer */
#define msgb_sctp_ppid(msg) (msg)->cb[3]
/*! \brief Access the SCTP Stream ID from the msgb control buffer */
#define msgb_sctp_stream(msg) (msg)->cb[4]
+/*! \defgroup stream_srv Osmocom Stream Server
+ * @{
+ *
+ * This code is intended to abstract any server-side use of stream-type sockets, such as TCP and SCTP.
+ *
+ * The Osmocom stream socket helper is an abstraction layer for connected SOCK_STREAM/SOCK_SEQPACKET sockets.
+ * It encapsulates common functionality like binding, accepting client connections, etc.
+ *
+ * osmo_stream_srv can operate in two different modes:
+ * 1. The legacy mode using osmo_fd (from libosmocore)
+ * 2. The modern (2023) mode using osmo_io (from libosmocore)
+ *
+ * For any new applications, you definitely should use the modern mode, as it provides you with a higher
+ * layer of abstraction and allows you to perform efficient I/O using the io_uring backend of osmo_io.
+ *
+ * The two main objects are osmo_stream_srv_link (main server accept()ing incoming connections) and
+ * osmo_stream_srv (a single given connection from a remote client).
+ *
+ * A typical stream_srv usage would look like this:
+ *
+ * * create new osmo_stream_srv_link using osmo_stream_srv_link_create()
+ * * call osmo_stream_srv_link_set_addr() to set local bind address/port
+ * * call osmo_stream_srv_link_set_accept_cb() to register the accept call-back
+ * * optionally call further osmo_stream_srv_link_set_*() functions
+ * * call osmo_stream_srv_link_open() to create socket and start listening
+ *
+ * Whenever a client connects to your listening socket, the connection will now be automatically accept()ed
+ * and the registered accept_cb call-back called. From within that accept_cb, you then
+ * * call osmo_stream_srv_create() to create a osmo_stream_srv for that specific connection
+ * * call osmo_stream_srv_set_read_cb() to register the read call-back for incoming data
+ * * call osmo_stream_srv_set_closed_cb() to register the closed call-back
+ * * call osmo_stream_srv_set_data() to associate opaque application-layer state
+ *
+ * Whenever data from a client arrives on a connection, your registered read_cb will be called together
+ * with a message buffer containing the received data. Ownership of the message buffer is transferred
+ * into the call-back, i.e. in your application. It's your responsibility to eventually msgb_free()
+ * it after usage.
+ *
+ * Whenever your application wants to transmit something to a given connection, it uses the
+ * osmo_stream_srv_send() function.
+ */
+
/*! \brief Osmocom Stream Server Link: A server socket listening/accepting */
struct osmo_stream_srv_link;
+typedef int (*osmo_stream_srv_link_accept_cb_t)(struct osmo_stream_srv_link *link, int fd);
+
struct osmo_stream_srv_link *osmo_stream_srv_link_create(void *ctx);
void osmo_stream_srv_link_destroy(struct osmo_stream_srv_link *link);
+void osmo_stream_srv_link_set_name(struct osmo_stream_srv_link *link, const char *name);
+const char *osmo_stream_srv_link_get_name(const struct osmo_stream_srv_link *link);
void osmo_stream_srv_link_set_nodelay(struct osmo_stream_srv_link *link, bool nodelay);
void osmo_stream_srv_link_set_addr(struct osmo_stream_srv_link *link, const char *addr);
int osmo_stream_srv_link_set_addrs(struct osmo_stream_srv_link *link, const char **addr, size_t addrcnt);
void osmo_stream_srv_link_set_port(struct osmo_stream_srv_link *link, uint16_t port);
void osmo_stream_srv_link_set_proto(struct osmo_stream_srv_link *link, uint16_t proto);
-void osmo_stream_srv_link_set_accept_cb(struct osmo_stream_srv_link *link, int (*accept_cb)(struct osmo_stream_srv_link *link, int fd));
+int osmo_stream_srv_link_set_type(struct osmo_stream_srv_link *link, int type);
+int osmo_stream_srv_link_set_domain(struct osmo_stream_srv_link *link, int domain);
+void osmo_stream_srv_link_set_accept_cb(struct osmo_stream_srv_link *link, osmo_stream_srv_link_accept_cb_t accept_cb);
void osmo_stream_srv_link_set_data(struct osmo_stream_srv_link *link, void *data);
void *osmo_stream_srv_link_get_data(struct osmo_stream_srv_link *link);
char *osmo_stream_srv_link_get_sockname(const struct osmo_stream_srv_link *link);
struct osmo_fd *osmo_stream_srv_link_get_ofd(struct osmo_stream_srv_link *link);
-
+int osmo_stream_srv_link_get_fd(const struct osmo_stream_srv_link *link);
+bool osmo_stream_srv_link_is_opened(const struct osmo_stream_srv_link *link);
int osmo_stream_srv_link_open(struct osmo_stream_srv_link *link);
void osmo_stream_srv_link_close(struct osmo_stream_srv_link *link);
+enum osmo_stream_srv_link_param {
+ OSMO_STREAM_SRV_LINK_PAR_SCTP_SOCKOPT_AUTH_SUPPORTED, /* uint8_t: 0 disable, 1 enable, 2 force disable, 3 force enable */
+ OSMO_STREAM_SRV_LINK_PAR_SCTP_SOCKOPT_ASCONF_SUPPORTED, /* uint8_t: 0 disable, 1 enable, 2 force disable, 3 force enable */
+ OSMO_STREAM_SRV_LINK_PAR_SCTP_INIT_NUM_OSTREAMS, /* uint16_t: amount of streams */
+ OSMO_STREAM_SRV_LINK_PAR_SCTP_INIT_MAX_INSTREAMS, /* uint16_t: amount of streams */
+};
+
+int osmo_stream_srv_link_set_param(struct osmo_stream_srv_link *link, enum osmo_stream_srv_link_param par,
+ void *val, size_t val_len);
+
/*! \brief Osmocom Stream Server: Single connection accept()ed via \ref
* osmo_stream_srv_link */
struct osmo_stream_srv;
-struct osmo_stream_srv *osmo_stream_srv_create(void *ctx, struct osmo_stream_srv_link *link, int fd, int (*cb)(struct osmo_stream_srv *conn), int (*closed_cb)(struct osmo_stream_srv *conn), void *data);
+typedef int (*osmo_stream_srv_read_cb_t)(struct osmo_stream_srv *conn);
+typedef int (*osmo_stream_srv_closed_cb_t)(struct osmo_stream_srv *conn);
+
+/*! Completion call-back function when something was read from from the stream client socket.
+ * \param[in] conn Stream Server that got receive event.
+ * \param[in] res return value of the read()/recvmsg()/... call, or -errno in case of error.
+ * \param[in] msg message buffer containing the read data. Ownership is transferred to the
+ * call-back, and it must make sure to msgb_free() it eventually! */
+typedef int (*osmo_stream_srv_read_cb2_t)(struct osmo_stream_srv *conn, int res, struct msgb *msg);
+
+typedef int (*osmo_stream_srv_segmentation_cb_t)(struct msgb *msg);
+
+struct osmo_stream_srv *osmo_stream_srv_create(void *ctx, struct osmo_stream_srv_link *link, int fd,
+ osmo_stream_srv_read_cb_t read_cb,
+ osmo_stream_srv_closed_cb_t closed_cb,
+ void *data);
+struct osmo_stream_srv *osmo_stream_srv_create2(void *ctx, struct osmo_stream_srv_link *link, int fd, void *data);
+void osmo_stream_srv_set_name(struct osmo_stream_srv *conn, const char *name);
+const char *osmo_stream_srv_get_name(const struct osmo_stream_srv *conn);
+void osmo_stream_srv_set_read_cb(struct osmo_stream_srv *conn, osmo_stream_srv_read_cb2_t read_cb);
+void osmo_stream_srv_set_closed_cb(struct osmo_stream_srv *conn, osmo_stream_srv_closed_cb_t close_cb);
void *osmo_stream_srv_get_data(struct osmo_stream_srv *conn);
struct osmo_stream_srv_link *osmo_stream_srv_get_master(struct osmo_stream_srv *conn);
+const char *osmo_stream_srv_get_sockname(const struct osmo_stream_srv *conn);
struct osmo_fd *osmo_stream_srv_get_ofd(struct osmo_stream_srv *srv);
+int osmo_stream_srv_get_fd(const struct osmo_stream_srv *srv);
+struct osmo_io_fd *osmo_stream_srv_get_iofd(const struct osmo_stream_srv *srv);
void osmo_stream_srv_destroy(struct osmo_stream_srv *conn);
void osmo_stream_srv_set_flush_and_destroy(struct osmo_stream_srv *conn);
void osmo_stream_srv_set_data(struct osmo_stream_srv *conn, void *data);
+void osmo_stream_srv_set_segmentation_cb(struct osmo_stream_srv *conn, osmo_stream_srv_segmentation_cb_t segmentation_cb);
+
void osmo_stream_srv_send(struct osmo_stream_srv *conn, struct msgb *msg);
int osmo_stream_srv_recv(struct osmo_stream_srv *conn, struct msgb *msg);
+void osmo_stream_srv_clear_tx_queue(struct osmo_stream_srv *conn);
+
+/*! @} */
+
+/*! \defgroup stream_cli Osmocom Stream Client
+ * @{
+ *
+ * This code is intended to abstract any client use of stream-type sockets, such as TCP and SCTP
+ *
+ * An osmo_stream_cli represents a client implementation of a SOCK_STREAM or SOCK_SEQPACKET socket. It
+ * contains all the common logic like non-blocking outbound connect to a remote server, re-connecting after
+ * disconnect or connect failure, etc.
+ *
+ * osmo_stream_cli can operate in two different modes:
+ * 1. The legacy mode using osmo_fd (from libosmocore)
+ * 2. The modern (2023) mode using osmo_io_fd (from libosmocore)
+ *
+ * For any new applications, you definitely should use the modern mode, as it provides you with a higher
+ * layer of abstraction and allows you to perform efficient I/O using the io_uring backend of osmo_io.
+ *
+ * A typical usage of osmo_stream_cli would look as follows:
+ *
+ * * call osmo_stream_cli_create() to create a new osmo_stream_cli
+ * * call osmo_stream_cli_set_addr() / osmo_stream_cli_set_port() to specify the remote address/port to connect to
+ * * optionally call further functions of the osmo_stream_cli_set_*() family
+ * * call osmo_stream_cli_set_connect_cb() to register the call-back called on completion of outbound connect()
+ * * call osmo_stream_cli_set_read_cb2() to register the call-back called when incoming data has been read
+ * * call osmo_stream_cli_open() to open the connection (start outbound connect process)
+ *
+ * Once the connection is established, your connect_cb is called to notify you.
+ *
+ * You may send data to the connection using osmo_tream_cli_send().
+ *
+ * Any received inbound data on the connection is reported vie the read_cb.
+ */
+
/*! \brief Osmocom Stream Client: Single client connection */
struct osmo_stream_cli;
+typedef int (*osmo_stream_cli_connect_cb_t)(struct osmo_stream_cli *cli);
+typedef int (*osmo_stream_cli_disconnect_cb_t)(struct osmo_stream_cli *cli);
+typedef int (*osmo_stream_cli_read_cb_t)(struct osmo_stream_cli *cli);
+
+/*! Completion call-back function when something was read from from the stream client socket.
+ * \param[in] cli Stream Client that got receive event.
+ * \param[in] res return value of the read()/recvmsg()/... call, or -errno in case of error.
+ * \param[in] msg message buffer containing the read data. Ownership is transferred to the
+ * call-back, and it must make sure to msgb_free() it eventually! */
+typedef int (*osmo_stream_cli_read_cb2_t)(struct osmo_stream_cli *cli, int res, struct msgb *msg);
+
+typedef int (*osmo_stream_cli_segmentation_cb_t)(struct msgb *msg);
+
+void osmo_stream_cli_set_name(struct osmo_stream_cli *cli, const char *name);
+const char *osmo_stream_cli_get_name(const struct osmo_stream_cli *cli);
void osmo_stream_cli_set_nodelay(struct osmo_stream_cli *cli, bool nodelay);
void osmo_stream_cli_set_addr(struct osmo_stream_cli *cli, const char *addr);
int osmo_stream_cli_set_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt);
void osmo_stream_cli_set_port(struct osmo_stream_cli *cli, uint16_t port);
+int osmo_stream_cli_set_type(struct osmo_stream_cli *cli, int type);
+int osmo_stream_cli_set_domain(struct osmo_stream_cli *cli, int domain);
void osmo_stream_cli_set_proto(struct osmo_stream_cli *cli, uint16_t proto);
void osmo_stream_cli_set_local_addr(struct osmo_stream_cli *cli, const char *addr);
int osmo_stream_cli_set_local_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt);
@@ -66,9 +206,13 @@ void osmo_stream_cli_set_reconnect_timeout(struct osmo_stream_cli *cli, int time
void *osmo_stream_cli_get_data(struct osmo_stream_cli *cli);
char *osmo_stream_cli_get_sockname(const struct osmo_stream_cli *cli);
struct osmo_fd *osmo_stream_cli_get_ofd(struct osmo_stream_cli *cli);
-void osmo_stream_cli_set_connect_cb(struct osmo_stream_cli *cli, int (*connect_cb)(struct osmo_stream_cli *cli));
-void osmo_stream_cli_set_disconnect_cb(struct osmo_stream_cli *cli, int (*disconnect_cb)(struct osmo_stream_cli *cli));
-void osmo_stream_cli_set_read_cb(struct osmo_stream_cli *cli, int (*read_cb)(struct osmo_stream_cli *cli));
+int osmo_stream_cli_get_fd(const struct osmo_stream_cli *cli);
+struct osmo_io_fd *osmo_stream_cli_get_iofd(const struct osmo_stream_cli *cli);
+void osmo_stream_cli_set_connect_cb(struct osmo_stream_cli *cli, osmo_stream_cli_connect_cb_t connect_cb);
+void osmo_stream_cli_set_disconnect_cb(struct osmo_stream_cli *cli, osmo_stream_cli_disconnect_cb_t disconnect_cb);
+void osmo_stream_cli_set_read_cb(struct osmo_stream_cli *cli, osmo_stream_cli_read_cb_t read_cb);
+void osmo_stream_cli_set_read_cb2(struct osmo_stream_cli *cli, osmo_stream_cli_read_cb2_t read_cb);
+void osmo_stream_cli_set_segmentation_cb(struct osmo_stream_cli *cli, osmo_stream_cli_segmentation_cb_t segmentation_cb);
void osmo_stream_cli_reconnect(struct osmo_stream_cli *cli);
bool osmo_stream_cli_is_connected(struct osmo_stream_cli *cli);
@@ -81,6 +225,20 @@ int osmo_stream_cli_open2(struct osmo_stream_cli *cli, int reconnect) \
void osmo_stream_cli_close(struct osmo_stream_cli *cli);
void osmo_stream_cli_send(struct osmo_stream_cli *cli, struct msgb *msg);
-int osmo_stream_cli_recv(struct osmo_stream_cli *conn, struct msgb *msg);
+int osmo_stream_cli_recv(struct osmo_stream_cli *cli, struct msgb *msg);
+
+void osmo_stream_cli_clear_tx_queue(struct osmo_stream_cli *cli);
+
+enum osmo_stream_cli_param {
+ OSMO_STREAM_CLI_PAR_SCTP_SOCKOPT_AUTH_SUPPORTED, /* uint8_t: 0 disable, 1 enable, 2 force disable, 3 force enable */
+ OSMO_STREAM_CLI_PAR_SCTP_SOCKOPT_ASCONF_SUPPORTED, /* uint8_t: 0 disable, 1 enable, 2 force disable, 3 force enable */
+ OSMO_STREAM_CLI_PAR_SCTP_INIT_NUM_OSTREAMS, /* uint16_t: amount of streams */
+ OSMO_STREAM_CLI_PAR_SCTP_INIT_MAX_INSTREAMS, /* uint16_t: amount of streams */
+ OSMO_STREAM_CLI_PAR_SCTP_INIT_MAX_ATTEMPTS, /* uint16_t: amount of attempts */
+ OSMO_STREAM_CLI_PAR_SCTP_INIT_TIMEOUT, /* uint16_t: milliseconds */
+};
+
+int osmo_stream_cli_set_param(struct osmo_stream_cli *cli, enum osmo_stream_cli_param par,
+ void *val, size_t val_len);
/*! @} */
diff --git a/include/osmocom/netif/stream_private.h b/include/osmocom/netif/stream_private.h
new file mode 100644
index 0000000..dc7506d
--- /dev/null
+++ b/include/osmocom/netif/stream_private.h
@@ -0,0 +1,42 @@
+#pragma once
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <osmocom/core/socket.h>
+
+#include "config.h"
+
+#ifdef HAVE_LIBSCTP
+#include <netinet/sctp.h>
+ #define OSMO_STREAM_MAX_ADDRS OSMO_SOCK_MAX_ADDRS
+ /*
+ * Platforms that don't have MSG_NOSIGNAL (which disables SIGPIPE)
+ * usually have SO_NOSIGPIPE (set via setsockopt).
+ */
+ #ifndef MSG_NOSIGNAL
+ #define MSG_NOSIGNAL 0
+ #endif
+#else
+ #define OSMO_STREAM_MAX_ADDRS 1
+#endif
+
+/*! \cond private */
+
+enum osmo_stream_mode {
+ OSMO_STREAM_MODE_UNKNOWN,
+ OSMO_STREAM_MODE_OSMO_FD,
+ OSMO_STREAM_MODE_OSMO_IO,
+};
+
+struct osmo_io_fd;
+struct msghdr;
+
+int stream_sctp_sock_activate_events(int fd);
+int stream_setsockopt_nodelay(int fd, int proto, int on);
+int stream_sctp_recvmsg_wrapper(int fd, struct msgb *msg, const char *log_pfx);
+
+int stream_iofd_sctp_send_msgb(struct osmo_io_fd *iofd, struct msgb *msg, int sendmsg_flags);
+int stream_iofd_sctp_recvmsg_trailer(struct osmo_io_fd *iofd, struct msgb *msg, int ret, const struct msghdr *msgh);
+
+/*! \endcond */
diff --git a/libosmo-netif.pc.in b/libosmo-netif.pc.in
index 7f1335e..1a925f6 100644
--- a/libosmo-netif.pc.in
+++ b/libosmo-netif.pc.in
@@ -7,5 +7,5 @@ Name: Osmocom network interface library
Description: C Utility Library
Version: @VERSION@
Libs: -L${libdir} -losmonetif
-Libs.private: @LIBSCTP_LIBS@
+Libs.private: @LIBSCTP_LIBS@ @LIBOSMOCORE_LIBS@
Cflags: -I${includedir}/
diff --git a/src/Makefile.am b/src/Makefile.am
index 64fd1d4..7b38ac0 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,6 +1,6 @@
# This is _NOT_ the library release version, it's an API version.
# Please read Chapter 6 "Library interface versions" of the libtool documentation before making any modification
-LIBVERSION=9:0:1
+LIBVERSION=12:0:1
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)
AM_CFLAGS= -fPIC -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOABIS_CFLAGS) $(COVERAGE_CFLAGS) $(LIBSCTP_CFLAGS)
@@ -9,7 +9,7 @@ AM_LDFLAGS = $(COVERAGE_LDFLAGS)
lib_LTLIBRARIES = libosmonetif.la
libosmonetif_la_LIBADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBSCTP_LIBS)
-libosmonetif_la_LDFLAGS = -version-info $(LIBVERSION) -no-undefined
+libosmonetif_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBVERSION) -no-undefined
libosmonetif_la_SOURCES = amr.c \
datagram.c \
@@ -17,6 +17,15 @@ libosmonetif_la_SOURCES = amr.c \
ipa_unit.c \
jibuf.c \
osmux.c \
+ osmux_input.c \
+ osmux_output.c \
+ prim.c \
rs232.c \
rtp.c \
+ stream_cli.c \
+ stream_srv.c \
stream.c
+
+if ENABLE_LIBSCTP
+libosmonetif_la_SOURCES += sctp.c
+endif
diff --git a/src/amr.c b/src/amr.c
index 2706432..f201e8a 100644
--- a/src/amr.c
+++ b/src/amr.c
@@ -14,9 +14,11 @@
#include <unistd.h>
#include <string.h>
#include <stdbool.h>
+
+#include <osmocom/core/utils.h>
#include <osmocom/netif/amr.h>
-/* According to TS 26.101:
+/* According to TS 26.101 Table A.1b:
*
* Frame type AMR code bits bytes
* 0 4.75 95 12
@@ -27,18 +29,33 @@
* 5 7.95 159 20
* 6 10.20 204 26
* 7 12.20 244 31
+ * 8 AMR SID 39 5
+ * 9 GSM-EFR SID 43 5
+ * 10 TDMA-EFR SID 38 5
+ * 11 PDC-EFR SID 37 5
+ * 12 NOT USED
+ * 13 NOT USED
+ * 14 NOT USED
+ * 15 NO DATA 0 0
*/
-static size_t amr_ft_to_bits[AMR_FT_MAX] = {
- [AMR_FT_0] = AMR_FT_0_LEN_BITS,
- [AMR_FT_1] = AMR_FT_1_LEN_BITS,
- [AMR_FT_2] = AMR_FT_2_LEN_BITS,
- [AMR_FT_3] = AMR_FT_3_LEN_BITS,
- [AMR_FT_4] = AMR_FT_4_LEN_BITS,
- [AMR_FT_5] = AMR_FT_5_LEN_BITS,
- [AMR_FT_6] = AMR_FT_6_LEN_BITS,
- [AMR_FT_7] = AMR_FT_7_LEN_BITS,
- [AMR_FT_SID] = AMR_FT_SID_LEN_BITS,
+static int amr_ft_to_bits[AMR_FT_MAX] = {
+ [AMR_FT_0] = AMR_FT_0_LEN_BITS,
+ [AMR_FT_1] = AMR_FT_1_LEN_BITS,
+ [AMR_FT_2] = AMR_FT_2_LEN_BITS,
+ [AMR_FT_3] = AMR_FT_3_LEN_BITS,
+ [AMR_FT_4] = AMR_FT_4_LEN_BITS,
+ [AMR_FT_5] = AMR_FT_5_LEN_BITS,
+ [AMR_FT_6] = AMR_FT_6_LEN_BITS,
+ [AMR_FT_7] = AMR_FT_7_LEN_BITS,
+ [AMR_FT_SID] = AMR_FT_SID_LEN_BITS,
+ [AMR_FT_GSM_EFR_SID] = AMR_FT_GSM_EFR_SID_LEN_BITS,
+ [AMR_FT_TDMA_EFR_SID] = AMR_FT_TDMA_EFR_SID_LEN_BITS,
+ [AMR_FT_PDC_EFR_SID] = AMR_FT_PDC_EFR_SID_LEN_BITS,
+ [12] = 0, /* for future use */
+ [13] = 0, /* for future use */
+ [14] = 0, /* for future use */
+ [AMR_FT_NO_DATA] = AMR_FT_NO_DATA_LEN_BITS,
};
static size_t amr_ft_to_bytes[AMR_FT_MAX] = {
@@ -51,49 +68,59 @@ static size_t amr_ft_to_bytes[AMR_FT_MAX] = {
[AMR_FT_6] = AMR_FT_6_LEN,
[AMR_FT_7] = AMR_FT_7_LEN,
[AMR_FT_SID] = AMR_FT_SID_LEN,
+ [AMR_FT_GSM_EFR_SID] = AMR_FT_GSM_EFR_SID_LEN,
+ [AMR_FT_TDMA_EFR_SID] = AMR_FT_TDMA_EFR_SID_LEN,
+ [AMR_FT_PDC_EFR_SID] = AMR_FT_PDC_EFR_SID_LEN,
+ [12] = 0, /* for future use */
+ [13] = 0, /* for future use */
+ [14] = 0, /* for future use */
+ [AMR_FT_NO_DATA] = AMR_FT_NO_DATA_LEN,
};
size_t osmo_amr_bits(uint8_t amr_ft)
{
+ OSMO_ASSERT(amr_ft < AMR_FT_MAX);
return amr_ft_to_bits[amr_ft];
}
size_t osmo_amr_bytes(uint8_t amr_ft)
{
+ OSMO_ASSERT(amr_ft < AMR_FT_MAX);
return amr_ft_to_bytes[amr_ft];
}
+int osmo_amr_bytes_to_ft(size_t bytes)
+{
+ int ft;
+
+ for (ft = 0; ft < AMR_FT_PDC_EFR_SID; ft++) {
+ if (amr_ft_to_bytes[ft] == bytes)
+ return ft;
+ }
+ /* 12-14 not used, jump to 15 (AMR_FT_NO_DATA): */
+ if (amr_ft_to_bytes[AMR_FT_NO_DATA] == bytes)
+ return AMR_FT_NO_DATA;
+
+ return -1;
+}
+
int osmo_amr_ft_valid(uint8_t amr_ft)
{
- /*
- * Extracted from RFC3267:
- *
- * "... with a FT value in the range 9-14 for AMR ... the whole packet
- * SHOULD be discarded."
- *
- * "... packets containing only NO_DATA frames (FT=15) SHOULD NOT be
- * transmitted."
- *
- * So, let's discard frames with a AMR FT >= 9.
- */
- if (amr_ft >= AMR_FT_MAX)
- return 0;
-
- return 1;
+ return amr_ft <= AMR_FT_PDC_EFR_SID || amr_ft == AMR_FT_NO_DATA;
}
/*! Check if an AMR frame is octet aligned by looking at the padding bits.
* \param[inout] payload user provided memory containing the AMR payload.
* \param[in] payload_len overall length of the AMR payload.
* \returns true when the payload is octet aligned. */
-bool osmo_amr_is_oa(uint8_t *payload, unsigned int payload_len)
+bool osmo_amr_is_oa(const uint8_t *payload, unsigned int payload_len)
{
/* NOTE: The distinction between octet-aligned and bandwith-efficient
* mode normally relys on out of band methods that explicitly select
* one of the two modes. (See also RFC 3267, chapter 3.8). However the
* A interface in GSM does not provide ways to communicate which mode
- * is used exactly used. The following functions uses some heuristics
- * to check if an AMR payload is octet aligned or not. */
+ * is exactly used. The following functions uses some heuristics to
+ * check if an AMR payload is octet aligned or not. */
struct amr_hdr *oa_hdr = (struct amr_hdr *)payload;
unsigned int frame_len;
@@ -152,7 +179,7 @@ int osmo_amr_oa_to_bwe(uint8_t *payload, unsigned int payload_len)
return -1;
/* Move TOC close to CMR */
- payload[0] |= (payload[1] >> 4) & 0x0f;
+ payload[0] = (payload[0] & 0xf0) | ((payload[1] >> 4) & 0x0f);
payload[1] = (payload[1] << 4) & 0xf0;
for (i = 0; i < frame_len; i++) {
@@ -161,7 +188,7 @@ int osmo_amr_oa_to_bwe(uint8_t *payload, unsigned int payload_len)
}
/* Calculate new payload length */
- bwe_payload_len = (10 + osmo_amr_bits(ft) + 7) / 8;
+ bwe_payload_len = OSMO_BYTES_FOR_BITS(AMR_HDR_BWE_LEN_BITS + osmo_amr_bits(ft));
return bwe_payload_len;
}
@@ -176,11 +203,14 @@ int osmo_amr_bwe_to_oa(uint8_t *payload, unsigned int payload_len,
{
uint8_t buf[256];
/* The header is only valid after shifting first two bytes to OA mode */
+ struct amr_hdr_bwe *bwe_hdr = (struct amr_hdr_bwe *)payload;
struct amr_hdr *oa_hdr;
unsigned int i;
- int oa_payload_len;
+ unsigned int oa_payload_len;
+ uint8_t ft;
- memset(buf, 0, sizeof(buf));
+ if (payload_len < sizeof(struct amr_hdr_bwe))
+ return -1;
if (payload_len + 1 > payload_maxlen)
return -1;
@@ -188,22 +218,98 @@ int osmo_amr_bwe_to_oa(uint8_t *payload, unsigned int payload_len,
if (payload_len + 1 > sizeof(buf))
return -1;
- buf[0] = payload[0] & 0xf0;
- buf[1] = payload[0] << 4;
- buf[1] |= (payload[1] >> 4) & 0x0c;
+ ft = (bwe_hdr->ft_hi << 1) | bwe_hdr->ft_lo;
+ if (!osmo_amr_ft_valid(ft))
+ return -1;
+ if (OSMO_BYTES_FOR_BITS(AMR_HDR_BWE_LEN_BITS + osmo_amr_bits(ft)) > payload_len)
+ return -1;
- /* Calculate new payload length */
+ memset(buf, 0, sizeof(buf));
oa_hdr = (struct amr_hdr *)buf;
- if (!osmo_amr_ft_valid(oa_hdr->ft))
- return -1;
- oa_payload_len = 2 + osmo_amr_bytes(oa_hdr->ft);
+ oa_hdr->cmr = bwe_hdr->cmr;
+ oa_hdr->f = bwe_hdr->f;
+ oa_hdr->ft = ft;
+ oa_hdr->q = bwe_hdr->q;
- for (i = 0; i < oa_payload_len - 3; i++) {
- buf[i + 2] = payload[i + 1] << 2;
- buf[i + 2] |= payload[i + 2] >> 6;
+ /* Calculate new payload length */
+ oa_payload_len = 2 + osmo_amr_bytes(ft);
+
+ for (i = 2; i < oa_payload_len - 1; i++) {
+ buf[i] = payload[i - 1] << 2;
+ buf[i] |= payload[i] >> 6;
}
- buf[i + 2] = payload[i + 1] << 2;
+ buf[i] = payload[i - 1] << 2;
memcpy(payload, buf, oa_payload_len);
return oa_payload_len;
}
+
+/*! Convert an AMR frame from bandwith-efficient mode to IuuP/IuFP payload.
+ * The IuuP/IuPF payload only contains the class a, b, c bits. No header.
+ * \param[inout] payload user provided memory containing the AMR payload.
+ * \param[in] payload_len overall length of the AMR payload.
+ * \param[in] payload_maxlen maximum length of the user provided memory.
+ * \returns resulting payload length, negative on error. */
+int osmo_amr_bwe_to_iuup(uint8_t *payload, unsigned int payload_len)
+{
+ /* The header is only valid after shifting first two bytes to OA mode */
+ unsigned int i, required_len_bits;
+ unsigned int amr_speech_len_bytes, amr_speech_len_bits;
+ uint8_t ft;
+
+ if (payload_len < 2)
+ return -1;
+
+ /* Calculate new payload length */
+ ft = ((payload[0] & 0x07) << 1) | ((payload[1] & 0x80) >> 7);
+ if (!osmo_amr_ft_valid(ft))
+ return -1;
+
+ amr_speech_len_bits = osmo_amr_bits(ft);
+ amr_speech_len_bytes = osmo_amr_bytes(ft);
+
+ /* shift of AMR_HDR_BWE_LEN_BITS (10) bits, aka remove BWE Hdr + ToC: */
+ required_len_bits = AMR_HDR_BWE_LEN_BITS + amr_speech_len_bits;
+ if (payload_len < OSMO_BYTES_FOR_BITS(required_len_bits))
+ return -1;
+
+ for (i = 0; i < amr_speech_len_bytes; i++) {
+ /* we have to shift the payload by 10 bits to get only the Class A, B, C bits */
+ payload[i] = (payload[i + 1] << 2) | ((payload[i + 2]) >> 6);
+ }
+
+ return amr_speech_len_bytes;
+}
+
+/*! Convert an AMR frame from IuuP/IuFP payload to bandwith-efficient mode.
+ * The IuuP/IuPF payload only contains the class a, b, c bits. No header.
+ * The resulting buffer has space at the start prepared to be filled by CMR, TOC.
+ * \param[inout] payload user provided memory containing the AMR payload.
+ * \param[in] payload_len overall length of the AMR payload.
+ * \param[in] payload_maxlen maximum length of the user provided memory (payload_len + 2 required).
+ * \returns resulting payload length, negative on error. */
+int osmo_amr_iuup_to_bwe(uint8_t *payload, unsigned int payload_len,
+ unsigned int payload_maxlen)
+{
+ /* shift all bits by AMR_HDR_BWE_LEN_BITS (10) */
+ unsigned int i, required_len_bits, required_len_bytes;
+
+ int ft = osmo_amr_bytes_to_ft(payload_len);
+ if (ft < 0)
+ return ft;
+
+ required_len_bits = osmo_amr_bits(ft) + 10;
+ required_len_bytes = OSMO_BYTES_FOR_BITS(required_len_bits);
+ if (payload_maxlen < required_len_bytes)
+ return -1;
+
+ i = payload_len + 1;
+ payload[i] = (payload[i - 2] << 6);
+ for (i = payload_len; i >= 2; i--) {
+ /* we have to shift the payload by AMR_HDR_BWE_LEN_BITS (10) bits to prepend BWE Hdr + ToC */
+ payload[i] = (payload[i - 1] >> 2) | (payload[i - 2] << 6);
+ }
+ payload[i] = (payload[i - 1] >> 2);
+ payload[0] = 0;
+ return required_len_bytes;
+}
diff --git a/src/datagram.c b/src/datagram.c
index 4bc7bed..9df0630 100644
--- a/src/datagram.c
+++ b/src/datagram.c
@@ -41,13 +41,12 @@
#include <osmocom/netif/datagram.h>
-/*! \addtogroup datagram Osmocom Datagram Socket
+#define OSMO_DGRAM_CLI_F_RECONF (1 << 0)
+
+#define OSMO_DGRAM_RX_F_RECONF (1 << 0)
+
+/*! \addtogroup datagram
* @{
- *
- * This code is intended to abstract any use of datagram type sockets,
- * such as UDP. It offers both transmitter and receiver side
- * implementations, fully integrated with the libosmocore select loop
- * abstraction.
*/
/*! \file datagram.c
@@ -59,8 +58,6 @@
* Client side.
*/
-#define OSMO_DGRAM_CLI_F_RECONF (1 << 0)
-
struct osmo_dgram_tx {
struct osmo_fd ofd;
struct llist_head tx_queue;
@@ -95,7 +92,7 @@ static int osmo_dgram_tx_write(struct osmo_dgram_tx *conn)
LOGP(DLINP, LOGL_DEBUG, "sending data\n");
if (llist_empty(&conn->tx_queue)) {
- conn->ofd.when &= ~OSMO_FD_WRITE;
+ osmo_fd_write_disable(&conn->ofd);
return 0;
}
lh = conn->tx_queue.next;
@@ -119,7 +116,7 @@ static int osmo_dgram_tx_fd_cb(struct osmo_fd *ofd, unsigned int what)
LOGP(DLINP, LOGL_DEBUG, "write\n");
osmo_dgram_tx_write(conn);
}
- return 0;
+ return 0;
}
/*! \brief Create an Osmocom datagram transmitter
@@ -236,22 +233,20 @@ void osmo_dgram_tx_send(struct osmo_dgram_tx *conn,
struct msgb *msg)
{
msgb_enqueue(&conn->tx_queue, msg);
- conn->ofd.when |= OSMO_FD_WRITE;
+ osmo_fd_write_enable(&conn->ofd);
}
/*
* Server side.
*/
-#define OSMO_DGRAM_RX_F_RECONF (1 << 0)
-
struct osmo_dgram_rx {
- struct osmo_fd ofd;
- char *addr;
- uint16_t port;
+ struct osmo_fd ofd;
+ char *addr;
+ uint16_t port;
int (*cb)(struct osmo_dgram_rx *conn);
- void *data;
- unsigned int flags;
+ void *data;
+ unsigned int flags;
};
/*! \brief Receive data via Osmocom datagram receiver
diff --git a/src/ipa.c b/src/ipa.c
index 197a47f..8720427 100644
--- a/src/ipa.c
+++ b/src/ipa.c
@@ -97,6 +97,11 @@ struct msgb *osmo_ipa_msg_alloc(int headroom)
return msg;
}
+struct msgb *osmo_ipa_ext_msg_alloc(size_t headroom)
+{
+ return osmo_ipa_msg_alloc(sizeof(struct ipa_head_ext) + headroom);
+}
+
void osmo_ipa_msg_push_header(struct msgb *msg, uint8_t proto)
{
struct ipa_head *hh;
@@ -366,3 +371,80 @@ osmo_ipa_parse_msg_id_resp(struct msgb *msg, struct ipaccess_unit *unit_data)
return 0;
}
+
+#define MSG_CB_IPA_INFO_OFFSET 0
+
+/* Check and remove headers (in case of p == IPAC_PROTO_OSMO, also the IPA extension header).
+ * Returns a negative number on error, otherwise the number of octets removed */
+static inline int ipa_check_pull_headers(struct msgb *msg)
+{
+ int ret;
+ size_t octets_removed = 0;
+ msg->l1h = msg->data;
+ struct ipa_head *ih = (struct ipa_head *)msg->data;
+ osmo_ipa_msgb_cb_proto(msg) = ih->proto;
+
+ if ((ret = osmo_ipa_process_msg(msg)) < 0) {
+ LOGP(DLINP, LOGL_ERROR, "Error processing IPA message\n");
+ return -EIO;
+ }
+ msgb_pull(msg, sizeof(struct ipa_head));
+ octets_removed += sizeof(struct ipa_head);
+ msg->l2h = msg->data;
+ if (ih->proto != IPAC_PROTO_OSMO)
+ return octets_removed;
+
+ osmo_ipa_msgb_cb_proto_ext(msg) = msg->data[0];
+ msgb_pull(msg, sizeof(struct ipa_head_ext));
+ octets_removed += sizeof(struct ipa_head_ext);
+ return octets_removed;
+}
+
+/*! Segmentation callback used by libosmo-netif streaming backend
+ * See definition of `struct osmo_io_ops` for callback semantics
+ * \param[out] msg Original `struct msgb` received via osmo_io
+ * \returns The total packet length indicated by the first header,
+ * otherwise negative number on error. Constants:
+ * -EAGAIN, if the header has not been read yet,
+ * -ENOBUFS, if the header declares a payload too large
+ */
+int osmo_ipa_segmentation_cb(struct msgb *msg)
+{
+ const struct ipa_head *hh = (const struct ipa_head *) msg->data;
+ size_t payload_len, total_len;
+ size_t available = msgb_length(msg) + msgb_tailroom(msg);
+ int removed_octets = 0;
+
+ if (msgb_length(msg) < sizeof(*hh)) {
+ /* Haven't even read the entire header */
+ return -EAGAIN;
+ }
+ payload_len = osmo_ntohs(hh->len);
+ total_len = sizeof(*hh) + payload_len;
+ if (OSMO_UNLIKELY(available < total_len)) {
+ LOGP(DLINP, LOGL_ERROR, "Not enough space left in message buffer. "
+ "Have %zu octets, but need %zu\n",
+ available, total_len);
+ return -ENOBUFS;
+ }
+ if (total_len <= msgb_length(msg)) {
+ removed_octets = ipa_check_pull_headers(msg);
+ if (removed_octets < 0) {
+ LOGP(DLINP, LOGL_ERROR, "Error pulling IPA headers\n");
+ return removed_octets;
+ }
+ }
+ return total_len;
+}
+
+/*! Push IPA headers to a message
+ * If we have IPAC_PROTO_OSMO this also takes care of the extension header
+ * \param[out] msg Target message
+ * \param p Target IPA protocol
+ * \param pe Target IPA protocol extension. Ignored, unless p equals IPAC_PROTO_OSMO. */
+void osmo_ipa_msg_push_headers(struct msgb *msg, enum ipaccess_proto p, enum ipaccess_proto_ext pe)
+{
+ if (p == IPAC_PROTO_OSMO)
+ ipa_prepend_header_ext(msg, pe);
+ osmo_ipa_msg_push_header(msg, p);
+}
diff --git a/src/jibuf.c b/src/jibuf.c
index 502f6e5..a351248 100644
--- a/src/jibuf.c
+++ b/src/jibuf.c
@@ -26,10 +26,6 @@
#include <arpa/inet.h>
-/*! \addtogroup jibuf Osmocom Jitter Buffer
- * @{
- */
-
/*! \file jibuf.c
* \brief Osmocom Jitter Buffer helpers
*/
@@ -290,6 +286,11 @@ static void recalc_threshold_delay(struct osmo_jibuf *jb)
}
+/*! \addtogroup jibuf Osmocom Jitter Buffer
+ * @{
+ */
+
+
//----------------------------------
/*! \brief Allocate a new jitter buffer instance
diff --git a/src/osmux.c b/src/osmux.c
index c43c3eb..999aedd 100644
--- a/src/osmux.c
+++ b/src/osmux.c
@@ -1,7 +1,7 @@
/*
* (C) 2012-2017 by Pablo Neira Ayuso <pablo@gnumonks.org>
* (C) 2012 by On Waves ehf <http://www.on-waves.com>
- * (C) 2015-2017 by sysmocom - s.f.m.c. GmbH
+ * (C) 2015-2022 by sysmocom - s.f.m.c. GmbH
*
* SPDX-License-Identifier: GPL-2.0+
*
@@ -27,6 +27,14 @@
#include <arpa/inet.h>
+#define SNPRINTF_BUFFER_SIZE(ret, remain, offset) \
+ if (ret < 0) \
+ ret = 0; \
+ offset += ret; \
+ if (ret > remain) \
+ ret = remain; \
+ remain -= ret;
+
/*! \addtogroup osmux Osmocom Multiplex Protocol
* @{
*
@@ -44,996 +52,22 @@
* \brief Osmocom multiplex protocol helpers
*/
-
-/* This allows you to debug timing reconstruction in the output path */
-#if 0
-#define DEBUG_TIMING 0
-#endif
-
-/* This allows you to debug osmux message transformations (spamming) */
-#if 0
-#define DEBUG_MSG 0
-#endif
-
-/* delta time between two RTP messages (in microseconds) */
-#define DELTA_RTP_MSG 20000
-/* delta time between two RTP messages (in samples, 8kHz) */
-#define DELTA_RTP_TIMESTAMP 160
-
-static void *osmux_ctx;
-
static uint32_t osmux_get_payload_len(struct osmux_hdr *osmuxh)
{
return osmo_amr_bytes(osmuxh->amr_ft) * (osmuxh->ctr+1);
}
-static uint32_t osmux_ft_dummy_size(uint8_t amr_ft, uint8_t batch_factor)
-{
- return sizeof(struct osmux_hdr) + (osmo_amr_bytes(amr_ft) * batch_factor);
-}
-
-struct osmux_hdr *osmux_xfrm_output_pull(struct msgb *msg)
-{
- struct osmux_hdr *osmuxh;
-next:
- osmuxh = NULL;
- if (msg->len > sizeof(struct osmux_hdr)) {
- size_t len;
-
- osmuxh = (struct osmux_hdr *)msg->data;
-
- switch (osmuxh->ft) {
- case OSMUX_FT_VOICE_AMR:
- break;
- case OSMUX_FT_DUMMY:
- len = osmux_ft_dummy_size(osmuxh->amr_ft, osmuxh->ctr + 1);
- if (msgb_length(msg) < len) {
- LOGP(DLMUX, LOGL_ERROR, "Discarding bad Dummy FT: %s\n",
- osmo_hexdump(msg->data, msgb_length(msg)));
- return NULL;
- }
- msgb_pull(msg, len);
- goto next;
- default:
- LOGP(DLMUX, LOGL_ERROR, "Discarding unsupported Osmux FT %d\n",
- osmuxh->ft);
- return NULL;
- }
- if (!osmo_amr_ft_valid(osmuxh->amr_ft)) {
- LOGP(DLMUX, LOGL_ERROR, "Discarding bad AMR FT %d\n",
- osmuxh->amr_ft);
- return NULL;
- }
-
- len = osmo_amr_bytes(osmuxh->amr_ft) * (osmuxh->ctr+1) +
- sizeof(struct osmux_hdr);
-
- if (msgb_length(msg) < len) {
- LOGP(DLMUX, LOGL_ERROR,
- "Discarding malformed OSMUX message: %s\n",
- osmo_hexdump(msg->data, msgb_length(msg)));
- return NULL;
- }
-
- msgb_pull(msg, len);
- } else if (msg->len > 0) {
- LOGP(DLMUX, LOGL_ERROR,
- "remaining %d bytes, broken osmuxhdr?\n", msg->len);
- }
-
- return osmuxh;
-}
-
-static struct msgb *
-osmux_rebuild_rtp(struct osmux_out_handle *h, struct osmux_hdr *osmuxh,
- void *payload, int payload_len, bool first_pkt)
-{
- struct msgb *prev_msg, *out_msg;
- struct timespec *prev_ts, *out_ts;
- struct rtp_hdr *rtph;
- struct amr_hdr *amrh;
- struct timespec delta = { .tv_sec = 0, .tv_nsec = DELTA_RTP_MSG*1000 };
-
- out_msg = msgb_alloc(sizeof(struct rtp_hdr) +
- sizeof(struct amr_hdr) +
- osmo_amr_bytes(osmuxh->amr_ft),
- "OSMUX test");
- if (out_msg == NULL)
- return NULL;
-
- /* Reconstruct RTP header */
- rtph = (struct rtp_hdr *)out_msg->data;
- rtph->csrc_count = 0;
- rtph->extension = 0;
- rtph->version = RTP_VERSION;
- rtph->payload_type = h->rtp_payload_type;
- /* ... emulate timestamp and ssrc */
- rtph->timestamp = htonl(h->rtp_timestamp);
- rtph->sequence = htons(h->rtp_seq);
- rtph->ssrc = htonl(h->rtp_ssrc);
- /* rtp packet with the marker bit is always guaranteed to be the first
- * one. We want to notify with marker in 2 scenarios:
- * 1- Sender told us through osmux frame rtp_m.
- * 2- Sntermediate osmux frame lost (seq gap), otherwise rtp receiver only sees
- * steady increase of delay
- */
- rtph->marker = first_pkt &&
- (osmuxh->rtp_m || (osmuxh->seq != h->osmux_seq_ack + 1));
-
- msgb_put(out_msg, sizeof(struct rtp_hdr));
-
- /* Reconstruct AMR header */
- amrh = (struct amr_hdr *)out_msg->tail;
- amrh->cmr = osmuxh->amr_cmr;
- amrh->f = osmuxh->amr_f;
- amrh->ft = osmuxh->amr_ft;
- amrh->q = osmuxh->amr_q;
-
- msgb_put(out_msg, sizeof(struct amr_hdr));
-
- /* add AMR speech data */
- memcpy(out_msg->tail, payload, payload_len);
- msgb_put(out_msg, payload_len);
-
- /* bump last RTP sequence number and timestamp that has been used */
- h->rtp_seq++;
- h->rtp_timestamp += DELTA_RTP_TIMESTAMP;
-
- out_ts = ((struct timespec *)&((out_msg)->cb[0]));
- if (first_pkt || llist_empty(&h->list)) {
- osmo_clock_gettime(CLOCK_MONOTONIC, out_ts);
- } else {
- prev_msg = llist_last_entry(&h->list, struct msgb, list);
- prev_ts = ((struct timespec *)&((prev_msg)->cb[0]));
- timespecadd(prev_ts, &delta, out_ts);
- }
-
- return out_msg;
-}
-
-int osmux_xfrm_output(struct osmux_hdr *osmuxh, struct osmux_out_handle *h,
- struct llist_head *list)
-{
- struct msgb *msg;
- int i;
-
- INIT_LLIST_HEAD(list);
-
- for (i=0; i<osmuxh->ctr+1; i++) {
- struct rtp_hdr *rtph;
-
- msg = osmux_rebuild_rtp(h, osmuxh,
- osmux_get_payload(osmuxh) +
- i * osmo_amr_bytes(osmuxh->amr_ft),
- osmo_amr_bytes(osmuxh->amr_ft), !i);
- if (msg == NULL)
- continue;
-
- rtph = osmo_rtp_get_hdr(msg);
- if (rtph == NULL)
- continue;
-
-#ifdef DEBUG_MSG
- {
- char buf[4096];
-
- osmo_rtp_snprintf(buf, sizeof(buf), msg);
- buf[sizeof(buf)-1] = '\0';
- LOGP(DLMUX, LOGL_DEBUG, "to BTS: %s\n", buf);
- }
-#endif
- llist_add_tail(&msg->list, list);
- }
-
- /* Update last seen seq number: */
- h->osmux_seq_ack = osmuxh->seq;
-
- return i;
-}
-
-static void osmux_xfrm_output_trigger(void *data)
-{
- struct osmux_out_handle *h = data;
- struct timespec delay_ts, now;
- struct msgb *msg, *next;
-
- llist_for_each_entry_safe(msg, next, &h->list, list) {
- osmo_clock_gettime(CLOCK_MONOTONIC, &now);
- struct timespec *msg_ts = ((struct timespec *)&((msg)->cb[0]));
- if (timespeccmp(msg_ts, &now, >)) {
- timespecsub(msg_ts, &now, &delay_ts);
- osmo_timer_schedule(&h->timer,
- delay_ts.tv_sec, delay_ts.tv_nsec / 1000);
- return;
- }
-
- /* Transmit the rtp packet */
- llist_del(&msg->list);
- if (h->tx_cb)
- h->tx_cb(msg, h->data);
- else
- msgb_free(msg);
- }
-}
-
-/*! \brief Generate RTP packets from osmux frame AMR payload set and schedule
- * them for transmission at appropiate time.
- * \param[in] h the osmux out handle handling a specific CID
- * \param[in] osmuxh Buffer pointing to osmux frame header structure and AMR payload
- * \return Number of generated RTP packets
- *
- * The osmux frame passed to this function must be of the type OSMUX_FT_VOICE_AMR.
- * The generated RTP packets are kept into h's internal list and sent to the
- * callback configured through osmux_xfrm_output_set_tx_cb when are ready to be
- * transmitted according to schedule.
- */
-int osmux_xfrm_output_sched(struct osmux_out_handle *h, struct osmux_hdr *osmuxh)
-{
- struct timespec now, *msg_ts;
- struct msgb *msg;
- int i;
- bool was_empty = llist_empty(&h->list);
-
- if (!was_empty) {
- /* If we received new data it means we are behind schedule and
- * we should flush all previous quickly */
- osmo_clock_gettime(CLOCK_MONOTONIC, &now);
- llist_for_each_entry(msg, &h->list, list) {
- msg_ts = ((struct timespec *)&((msg)->cb[0]));
- *msg_ts = now;
- }
- osmo_timer_schedule(&h->timer, 0, 0);
- }
-
- for (i=0; i<osmuxh->ctr+1; i++) {
- struct rtp_hdr *rtph;
-
- msg = osmux_rebuild_rtp(h, osmuxh,
- osmux_get_payload(osmuxh) +
- i * osmo_amr_bytes(osmuxh->amr_ft),
- osmo_amr_bytes(osmuxh->amr_ft), !i);
- if (msg == NULL)
- continue;
-
- rtph = osmo_rtp_get_hdr(msg);
- if (rtph == NULL)
- continue;
-
- llist_add_tail(&msg->list, &h->list);
- }
-
- /* Update last seen seq number: */
- h->osmux_seq_ack = osmuxh->seq;
-
- /* In case list is still empty after parsing messages, no need to rearm */
- if(was_empty && !llist_empty(&h->list))
- osmux_xfrm_output_trigger(h);
- return i;
-}
-
-/*! \brief Flush all scheduled RTP packets still pending to be transmitted
- * \param[in] h the osmux out handle to flush
- *
- * This function will immediately call the transmit callback for all queued RTP
- * packets, making sure the list ends up empty. It will also stop all internal
- * timers to make sure the osmux_out_handle can be dropped or re-used by calling
- * osmux_xfrm_output on it.
- */
-void osmux_xfrm_output_flush(struct osmux_out_handle *h)
-{
- struct msgb *msg, *next;
-
- if (osmo_timer_pending(&h->timer))
- osmo_timer_del(&h->timer);
-
- llist_for_each_entry_safe(msg, next, &h->list, list) {
- llist_del(&msg->list);
- if (h->tx_cb)
- h->tx_cb(msg, h->data);
- else
- msgb_free(msg);
- }
-}
-
-struct osmux_batch {
- struct osmo_timer_list timer;
- struct osmux_hdr *osmuxh;
- struct llist_head circuit_list;
- unsigned int remaining_bytes;
- uint8_t seq;
- uint32_t nmsgs;
- int ndummy;
-};
-
-struct osmux_circuit {
- struct llist_head head;
- int ccid;
- struct llist_head msg_list;
- int nmsgs;
- int dummy;
-};
-
-static int osmux_batch_enqueue(struct msgb *msg, struct osmux_circuit *circuit,
- uint8_t batch_factor)
-{
- /* Validate amount of messages per batch. The counter field of the
- * osmux header is just 3 bits long, so make sure it doesn't overflow.
- */
- if (circuit->nmsgs >= batch_factor || circuit->nmsgs >= 8) {
- struct rtp_hdr *rtph;
-
- rtph = osmo_rtp_get_hdr(msg);
- if (rtph == NULL)
- return -1;
-
- LOGP(DLMUX, LOGL_DEBUG, "Batch is full for RTP sssrc=%u\n", rtph->ssrc);
- return -1;
- }
-
- llist_add_tail(&msg->list, &circuit->msg_list);
- circuit->nmsgs++;
- return 0;
-}
-
-static void osmux_batch_dequeue(struct msgb *msg, struct osmux_circuit *circuit)
-{
- llist_del(&msg->list);
- circuit->nmsgs--;
-}
-
-static void osmux_circuit_del_msgs(struct osmux_batch *batch, struct osmux_circuit *circuit)
-{
- struct msgb *cur, *tmp;
- llist_for_each_entry_safe(cur, tmp, &circuit->msg_list, list) {
- osmux_batch_dequeue(cur, circuit);
- msgb_free(cur);
- batch->nmsgs--;
- }
-}
-
-struct osmux_input_state {
- struct msgb *out_msg;
- struct msgb *msg;
- struct rtp_hdr *rtph;
- struct amr_hdr *amrh;
- uint32_t amr_payload_len;
- int ccid;
- int add_osmux_hdr;
-};
-
-static int osmux_batch_put(struct osmux_batch *batch,
- struct osmux_input_state *state)
-{
- struct osmux_hdr *osmuxh;
-
- if (state->add_osmux_hdr) {
- osmuxh = (struct osmux_hdr *)state->out_msg->tail;
- osmuxh->ft = OSMUX_FT_VOICE_AMR;
- osmuxh->ctr = 0;
- osmuxh->rtp_m = osmuxh->rtp_m || state->rtph->marker;
- osmuxh->amr_f = state->amrh->f;
- osmuxh->amr_q= state->amrh->q;
- osmuxh->seq = batch->seq++;
- osmuxh->circuit_id = state->ccid;
- osmuxh->amr_cmr = state->amrh->cmr;
- osmuxh->amr_ft = state->amrh->ft;
- msgb_put(state->out_msg, sizeof(struct osmux_hdr));
-
- /* annotate current osmux header */
- batch->osmuxh = osmuxh;
- } else {
- if (batch->osmuxh->ctr == 0x7) {
- LOGP(DLMUX, LOGL_ERROR, "cannot add msg=%p, "
- "too many messages for this RTP ssrc=%u\n",
- state->msg, state->rtph->ssrc);
- return 0;
- }
- batch->osmuxh->ctr++;
- }
-
- memcpy(state->out_msg->tail, osmo_amr_get_payload(state->amrh),
- state->amr_payload_len);
- msgb_put(state->out_msg, state->amr_payload_len);
-
- return 0;
-}
-
-static int osmux_xfrm_encode_amr(struct osmux_batch *batch,
- struct osmux_input_state *state)
-{
- uint32_t amr_len;
-
- state->amrh = osmo_rtp_get_payload(state->rtph, state->msg, &amr_len);
- if (state->amrh == NULL)
- return -1;
-
- state->amr_payload_len = amr_len - sizeof(struct amr_hdr);
-
- if (osmux_batch_put(batch, state) < 0)
- return -1;
-
- return 0;
-}
-
-static void osmux_encode_dummy(struct osmux_batch *batch, uint8_t batch_factor,
- struct osmux_input_state *state)
-{
- struct osmux_hdr *osmuxh;
- /* TODO: This should be configurable at some point. */
- uint32_t payload_size = osmux_ft_dummy_size(AMR_FT_3, batch_factor) -
- sizeof(struct osmux_hdr);
-
- osmuxh = (struct osmux_hdr *)state->out_msg->tail;
- osmuxh->ft = OSMUX_FT_DUMMY;
- osmuxh->ctr = batch_factor - 1;
- osmuxh->amr_f = 0;
- osmuxh->amr_q= 0;
- osmuxh->seq = 0;
- osmuxh->circuit_id = state->ccid;
- osmuxh->amr_cmr = 0;
- osmuxh->amr_ft = AMR_FT_3;
- msgb_put(state->out_msg, sizeof(struct osmux_hdr));
-
- memset(state->out_msg->tail, 0xff, payload_size);
- msgb_put(state->out_msg, payload_size);
-}
-
-static struct msgb *osmux_build_batch(struct osmux_batch *batch,
- uint32_t batch_size, uint8_t batch_factor)
-{
- struct msgb *batch_msg;
- struct osmux_circuit *circuit;
-
-#ifdef DEBUG_MSG
- LOGP(DLMUX, LOGL_DEBUG, "Now building batch\n");
-#endif
-
- batch_msg = msgb_alloc(batch_size, "osmux");
- if (batch_msg == NULL) {
- LOGP(DLMUX, LOGL_ERROR, "Not enough memory\n");
- return NULL;
- }
-
- llist_for_each_entry(circuit, &batch->circuit_list, head) {
- struct msgb *cur, *tmp;
- int ctr = 0;
-
- if (circuit->dummy) {
- struct osmux_input_state state = {
- .out_msg = batch_msg,
- .ccid = circuit->ccid,
- };
- osmux_encode_dummy(batch, batch_factor, &state);
- continue;
- }
-
- llist_for_each_entry_safe(cur, tmp, &circuit->msg_list, list) {
- struct osmux_input_state state = {
- .msg = cur,
- .out_msg = batch_msg,
- .ccid = circuit->ccid,
- };
-#ifdef DEBUG_MSG
- char buf[4096];
-
- osmo_rtp_snprintf(buf, sizeof(buf), cur);
- buf[sizeof(buf)-1] = '\0';
- LOGP(DLMUX, LOGL_DEBUG, "to BSC-NAT: %s\n", buf);
-#endif
-
- state.rtph = osmo_rtp_get_hdr(cur);
- if (state.rtph == NULL)
- return NULL;
-
- if (ctr == 0) {
-#ifdef DEBUG_MSG
- LOGP(DLMUX, LOGL_DEBUG, "add osmux header\n");
-#endif
- state.add_osmux_hdr = 1;
- }
-
- osmux_xfrm_encode_amr(batch, &state);
- osmux_batch_dequeue(cur, circuit);
- msgb_free(cur);
- ctr++;
- batch->nmsgs--;
- }
- }
- return batch_msg;
-}
-
-void osmux_xfrm_input_deliver(struct osmux_in_handle *h)
-{
- struct msgb *batch_msg;
- struct osmux_batch *batch = (struct osmux_batch *)h->internal_data;
-
-#ifdef DEBUG_MSG
- LOGP(DLMUX, LOGL_DEBUG, "invoking delivery function\n");
-#endif
- batch_msg = osmux_build_batch(batch, h->batch_size, h->batch_factor);
- if (!batch_msg)
- return;
- h->stats.output_osmux_msgs++;
- h->stats.output_osmux_bytes += batch_msg->len;
-
- h->deliver(batch_msg, h->data);
- osmo_timer_del(&batch->timer);
- batch->remaining_bytes = h->batch_size;
-
- if (batch->ndummy) {
- osmo_timer_schedule(&batch->timer, 0,
- h->batch_factor * DELTA_RTP_MSG);
- }
-}
-
-static void osmux_batch_timer_expired(void *data)
-{
- struct osmux_in_handle *h = data;
-
-#ifdef DEBUG_MSG
- LOGP(DLMUX, LOGL_DEBUG, "osmux_batch_timer_expired\n");
-#endif
- osmux_xfrm_input_deliver(h);
-}
-
-static int osmux_rtp_amr_payload_len(struct msgb *msg, struct rtp_hdr *rtph)
-{
- struct amr_hdr *amrh;
- unsigned int amr_len;
- int amr_payload_len;
-
- amrh = osmo_rtp_get_payload(rtph, msg, &amr_len);
- if (amrh == NULL)
- return -1;
-
- if (!osmo_amr_ft_valid(amrh->ft))
- return -1;
-
- amr_payload_len = amr_len - sizeof(struct amr_hdr);
-
- /* The AMR payload does not fit with what we expect */
- if (osmo_amr_bytes(amrh->ft) != amr_payload_len) {
- LOGP(DLMUX, LOGL_ERROR,
- "Bad AMR frame, expected %zd bytes, got %d bytes\n",
- osmo_amr_bytes(amrh->ft), amr_len);
- return -1;
- }
- return amr_payload_len;
-}
-
-static void osmux_replay_lost_packets(struct osmux_circuit *circuit,
- struct rtp_hdr *cur_rtph, int batch_factor)
-{
- int16_t diff;
- struct msgb *last;
- struct rtp_hdr *rtph;
- int i;
-
- /* Have we see any RTP packet in this batch before? */
- if (llist_empty(&circuit->msg_list))
- return;
-
- /* Get last RTP packet seen in this batch */
- last = llist_entry(circuit->msg_list.prev, struct msgb, list);
- rtph = osmo_rtp_get_hdr(last);
- if (rtph == NULL)
- return;
-
- diff = ntohs(cur_rtph->sequence) - ntohs(rtph->sequence);
-
- /* Lifesaver: make sure bugs don't spawn lots of clones */
- if (diff > 16)
- diff = 16;
-
- /* If diff between last RTP packet seen and this one is > 1,
- * then we lost several RTP packets, let's replay them.
- */
- for (i=1; i<diff; i++) {
- struct msgb *clone;
-
- /* Clone last RTP packet seen */
- clone = msgb_alloc(last->data_len, "RTP clone");
- if (!clone)
- continue;
-
- memcpy(clone->data, last->data, last->len);
- msgb_put(clone, last->len);
-
- /* The original RTP message has been already sanity check. */
- rtph = osmo_rtp_get_hdr(clone);
-
- /* Adjust sequence number and timestamp */
- rtph->sequence = htons(ntohs(rtph->sequence) + i);
- rtph->timestamp = htonl(ntohl(rtph->timestamp) +
- DELTA_RTP_TIMESTAMP);
-
- /* No more room in this batch, skip padding with more clones */
- if (osmux_batch_enqueue(clone, circuit, batch_factor) < 0) {
- msgb_free(clone);
- break;
- }
-
- LOGP(DLMUX, LOGL_ERROR, "adding cloned RTP\n");
- }
-}
-
-static struct osmux_circuit *
-osmux_batch_find_circuit(struct osmux_batch *batch, int ccid)
-{
- struct osmux_circuit *circuit;
-
- llist_for_each_entry(circuit, &batch->circuit_list, head) {
- if (circuit->ccid == ccid)
- return circuit;
- }
- return NULL;
-}
-
-static struct osmux_circuit *
-osmux_batch_add_circuit(struct osmux_batch *batch, int ccid, int dummy,
- uint8_t batch_factor)
-{
- struct osmux_circuit *circuit;
-
- circuit = osmux_batch_find_circuit(batch, ccid);
- if (circuit != NULL) {
- LOGP(DLMUX, LOGL_ERROR, "circuit %u already exists!\n", ccid);
- return NULL;
- }
-
- circuit = talloc_zero(osmux_ctx, struct osmux_circuit);
- if (circuit == NULL) {
- LOGP(DLMUX, LOGL_ERROR, "OOM on circuit %u\n", ccid);
- return NULL;
- }
-
- circuit->ccid = ccid;
- INIT_LLIST_HEAD(&circuit->msg_list);
- llist_add_tail(&circuit->head, &batch->circuit_list);
-
- if (dummy) {
- circuit->dummy = dummy;
- batch->ndummy++;
- if (!osmo_timer_pending(&batch->timer))
- osmo_timer_schedule(&batch->timer, 0,
- batch_factor * DELTA_RTP_MSG);
- }
- return circuit;
-}
-
-static void osmux_batch_del_circuit(struct osmux_batch *batch, struct osmux_circuit *circuit)
-{
- if (circuit->dummy)
- batch->ndummy--;
- llist_del(&circuit->head);
- osmux_circuit_del_msgs(batch, circuit);
- talloc_free(circuit);
-}
-
-static int
-osmux_batch_add(struct osmux_batch *batch, uint32_t batch_factor, struct msgb *msg,
- struct rtp_hdr *rtph, int ccid)
-{
- int bytes = 0, amr_payload_len;
- struct osmux_circuit *circuit;
- struct msgb *cur;
-
- circuit = osmux_batch_find_circuit(batch, ccid);
- if (!circuit)
- return -1;
-
- /* We've seen the first RTP message, disable dummy padding */
- if (circuit->dummy) {
- circuit->dummy = 0;
- batch->ndummy--;
- }
- amr_payload_len = osmux_rtp_amr_payload_len(msg, rtph);
- if (amr_payload_len < 0)
- return -1;
-
- /* First check if there is room for this message in the batch */
- bytes += amr_payload_len;
- if (circuit->nmsgs == 0)
- bytes += sizeof(struct osmux_hdr);
-
- /* No room, sorry. You'll have to retry */
- if (bytes > batch->remaining_bytes)
- return 1;
-
- /* Init of talkspurt (RTP M marker bit) needs to be in the first AMR slot
- * of the OSMUX packet, enforce sending previous batch if required:
- */
- if (rtph->marker && circuit->nmsgs != 0)
- return 1;
-
-
- /* Extra validation: check if this message already exists, should not
- * happen but make sure we don't propagate duplicated messages.
- */
- llist_for_each_entry(cur, &circuit->msg_list, list) {
- struct rtp_hdr *rtph2 = osmo_rtp_get_hdr(cur);
- if (rtph2 == NULL)
- return -1;
-
- /* Already exists message with this sequence, skip */
- if (rtph2->sequence == rtph->sequence) {
- LOGP(DLMUX, LOGL_ERROR, "already exists "
- "message with seq=%u, skip it\n",
- rtph->sequence);
- return -1;
- }
- }
- /* Handle RTP packet loss scenario */
- osmux_replay_lost_packets(circuit, rtph, batch_factor);
-
- /* This batch is full, force batch delivery */
- if (osmux_batch_enqueue(msg, circuit, batch_factor) < 0)
- return 1;
-
-#ifdef DEBUG_MSG
- LOGP(DLMUX, LOGL_DEBUG, "adding msg with ssrc=%u to batch\n",
- rtph->ssrc);
-#endif
-
- /* Update remaining room in this batch */
- batch->remaining_bytes -= bytes;
-
- if (batch->nmsgs == 0) {
-#ifdef DEBUG_MSG
- LOGP(DLMUX, LOGL_DEBUG, "osmux start timer batch\n");
-#endif
- osmo_timer_schedule(&batch->timer, 0,
- batch_factor * DELTA_RTP_MSG);
- }
- batch->nmsgs++;
-
- return 0;
-}
-
-/**
- * osmux_xfrm_input - add RTP message to OSmux batch
- * \param msg: RTP message that you want to batch into one OSmux message
- *
- * If 0 is returned, this indicates that the message has been batched or that
- * an error occured and we have skipped the message. If 1 is returned, you
- * have to invoke osmux_xfrm_input_deliver and try again.
- *
- * The function takes care of releasing the messages in case of error and
- * when building the batch.
- */
-int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg, int ccid)
-{
- int ret;
- struct rtp_hdr *rtph;
- struct osmux_batch *batch = (struct osmux_batch *)h->internal_data;
-
- /* Ignore too big RTP/RTCP messages, most likely forged. Sanity check
- * to avoid a possible forever loop in the caller.
- */
- if (msg->len > h->batch_size - sizeof(struct osmux_hdr)) {
- msgb_free(msg);
- return 0;
- }
-
- rtph = osmo_rtp_get_hdr(msg);
- if (rtph == NULL) {
- msgb_free(msg);
- return 0;
- }
-
- switch(rtph->payload_type) {
- case RTP_PT_RTCP:
- msgb_free(msg);
- return 0;
- default:
- /* The RTP payload type is dynamically allocated,
- * although we use static ones. Assume that we always
- * receive AMR traffic.
- */
-
- /* Add this RTP to the OSMUX batch */
- ret = osmux_batch_add(batch, h->batch_factor,
- msg, rtph, ccid);
- if (ret < 0) {
- /* Cannot put this message into the batch.
- * Malformed, duplicated, OOM. Drop it and tell
- * the upper layer that we have digest it.
- */
- msgb_free(msg);
- return 0;
- }
-
- h->stats.input_rtp_msgs++;
- h->stats.input_rtp_bytes += msg->len;
- break;
- }
- return ret;
-}
-
-void osmux_xfrm_input_init(struct osmux_in_handle *h)
-{
- struct osmux_batch *batch;
-
- /* Default to osmux packet size if not specified */
- if (h->batch_size == 0)
- h->batch_size = OSMUX_BATCH_DEFAULT_MAX;
-
- batch = talloc_zero(osmux_ctx, struct osmux_batch);
- if (batch == NULL)
- return;
-
- INIT_LLIST_HEAD(&batch->circuit_list);
- batch->remaining_bytes = h->batch_size;
- osmo_timer_setup(&batch->timer, osmux_batch_timer_expired, h);
-
- h->internal_data = (void *)batch;
-
- LOGP(DLMUX, LOGL_DEBUG, "initialized osmux input converter\n");
-}
-
-/*! \brief Set transmission callback to call when a generated RTP packet is to be transmitted
- * \param[in] h the osmux out handle handling a specific CID
- * \param[in] osmuxh Buffer pointing to osmux frame header structure and AMR payload
- * \return Number of generated RTP packets
- *
- * This Function sets the callback called by the interal timer set by
- * osmux_xfrm_out_sched function.
- */
-void osmux_xfrm_output_set_tx_cb(struct osmux_out_handle *h,
- void (*tx_cb)(struct msgb *msg, void *data),
- void *data)
-{
- h->tx_cb = tx_cb;
- h->data = data;
-}
-
-int osmux_xfrm_input_open_circuit(struct osmux_in_handle *h, int ccid,
- int dummy)
-{
- struct osmux_batch *batch = (struct osmux_batch *)h->internal_data;
-
- return osmux_batch_add_circuit(batch, ccid, dummy, h->batch_factor) ? 0 : -1;
-}
-
-void osmux_xfrm_input_close_circuit(struct osmux_in_handle *h, int ccid)
-{
- struct osmux_batch *batch = (struct osmux_batch *)h->internal_data;
- struct osmux_circuit *circuit;
-
- circuit = osmux_batch_find_circuit(batch, ccid);
- if (circuit == NULL)
- return;
-
- osmux_batch_del_circuit(batch, circuit);
-}
-
-void osmux_xfrm_input_fini(struct osmux_in_handle *h)
-{
- struct osmux_batch *batch = (struct osmux_batch *)h->internal_data;
- struct osmux_circuit *circuit, *next;
-
- llist_for_each_entry_safe(circuit, next, &batch->circuit_list, head)
- osmux_batch_del_circuit(batch, circuit);
-
- osmo_timer_del(&batch->timer);
- talloc_free(batch);
-}
-
-struct osmux_tx_handle {
- struct osmo_timer_list timer;
- struct msgb *msg;
- void (*tx_cb)(struct msgb *msg, void *data);
- void *data;
-#ifdef DEBUG_TIMING
- struct timeval start;
- struct timeval when;
-#endif
-};
-
-static void osmux_tx_cb(void *data)
-{
- struct osmux_tx_handle *h = data;
-#ifdef DEBUG_TIMING
- struct timeval now, diff;
-
- osmo_gettimeofday(&now, NULL);
- timersub(&now, &h->start, &diff);
- timersub(&diff,&h->when, &diff);
- LOGP(DLMUX, LOGL_DEBUG, "we are lagging %lu.%.6lu in scheduled "
- "transmissions\n", diff.tv_sec, diff.tv_usec);
-#endif
-
- h->tx_cb(h->msg, h->data);
-
- talloc_free(h);
-}
-
-static void
-osmux_tx(struct msgb *msg, struct timeval *when,
- void (*tx_cb)(struct msgb *msg, void *data), void *data)
-{
- struct osmux_tx_handle *h;
-
- h = talloc_zero(osmux_ctx, struct osmux_tx_handle);
- if (h == NULL)
- return;
-
- h->msg = msg;
- h->tx_cb = tx_cb;
- h->data = data;
- osmo_timer_setup(&h->timer, osmux_tx_cb, h);
-
-#ifdef DEBUG_TIMING
- osmo_gettimeofday(&h->start, NULL);
- h->when.tv_sec = when->tv_sec;
- h->when.tv_usec = when->tv_usec;
-#endif
- /* send it now */
- if (when->tv_sec == 0 && when->tv_usec == 0) {
- osmux_tx_cb(h);
- return;
- }
- osmo_timer_schedule(&h->timer, when->tv_sec, when->tv_usec);
-}
-
-void
-osmux_tx_sched(struct llist_head *list,
- void (*tx_cb)(struct msgb *msg, void *data), void *data)
-{
- struct msgb *cur, *tmp;
- struct timeval delta = { .tv_sec = 0, .tv_usec = DELTA_RTP_MSG };
- struct timeval when;
-
- timerclear(&when);
-
- llist_for_each_entry_safe(cur, tmp, list, list) {
-
-#ifdef DEBUG_MSG
- LOGP(DLMUX, LOGL_DEBUG, "scheduled transmision in %lu.%6lu "
- "seconds, msg=%p\n", when.tv_sec, when.tv_usec, cur);
-#endif
- llist_del(&cur->list);
- osmux_tx(cur, &when, tx_cb, data);
- timeradd(&when, &delta, &when);
- }
-}
-
-void osmux_xfrm_output_init2(struct osmux_out_handle *h, uint32_t rtp_ssrc, uint8_t rtp_payload_type)
-{
- memset(h, 0, sizeof(*h));
- h->rtp_seq = (uint16_t)random();
- h->rtp_timestamp = (uint32_t)random();
- h->rtp_ssrc = rtp_ssrc;
- h->rtp_payload_type = rtp_payload_type;
- INIT_LLIST_HEAD(&h->list);
- osmo_timer_setup(&h->timer, osmux_xfrm_output_trigger, h);
-}
-
-void osmux_xfrm_output_init(struct osmux_out_handle *h, uint32_t rtp_ssrc)
-{
- /* backward compatibility with old users, where 98 was harcoded in osmux_rebuild_rtp() */
- osmux_xfrm_output_init2(h, rtp_ssrc, 98);
-}
-
-#define SNPRINTF_BUFFER_SIZE(ret, remain, offset) \
- if (ret < 0) \
- ret = 0; \
- offset += ret; \
- if (ret > remain) \
- ret = remain; \
- remain -= ret;
-
static int osmux_snprintf_header(char *buf, size_t size, struct osmux_hdr *osmuxh)
{
unsigned int remain = size, offset = 0;
int ret;
ret = snprintf(buf, remain, "OSMUX seq=%03u ccid=%03u "
- "ft=%01u ctr=%01u "
+ "ft=%01u rtp_m=%01u ctr=%01u "
"amr_f=%01u amr_q=%01u "
"amr_ft=%02u amr_cmr=%02u",
osmuxh->seq, osmuxh->circuit_id,
- osmuxh->ft, osmuxh->ctr,
+ osmuxh->ft, osmuxh->rtp_m, osmuxh->ctr,
osmuxh->amr_f, osmuxh->amr_q,
osmuxh->amr_ft, osmuxh->amr_cmr);
SNPRINTF_BUFFER_SIZE(ret, remain, offset);
diff --git a/src/osmux_input.c b/src/osmux_input.c
new file mode 100644
index 0000000..2184a08
--- /dev/null
+++ b/src/osmux_input.c
@@ -0,0 +1,857 @@
+/*
+ * (C) 2012-2017 by Pablo Neira Ayuso <pablo@gnumonks.org>
+ * (C) 2012 by On Waves ehf <http://www.on-waves.com>
+ * (C) 2015-2022 by sysmocom - s.f.m.c. GmbH
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <inttypes.h>
+
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/timer_compat.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/logging.h>
+
+#include <osmocom/netif/amr.h>
+#include <osmocom/netif/rtp.h>
+#include <osmocom/netif/osmux.h>
+
+#include <arpa/inet.h>
+
+/* This allows you to debug osmux message transformations (spamming) */
+#if 0
+#define DEBUG_MSG 0
+#endif
+
+/* delta time between two RTP messages (in microseconds) */
+#define DELTA_RTP_MSG 20000
+/* delta time between two RTP messages (in samples, 8kHz) */
+#define DELTA_RTP_TIMESTAMP 160
+
+#define LOGMUXLK_(link, lvl, fmt, args ...) \
+ LOGP(DLMUX, lvl, "[%s,%u/%" PRIu16 "]" fmt, \
+ (link)->name, (link)->h->batch_size - (link)->remaining_bytes, \
+ (link)->h->batch_size, \
+ ## args)
+
+#define LOGMUXLK(link, lvl, fmt, args ...) \
+ LOGMUXLK_(link, lvl, " " fmt, ## args)
+
+#define LOGMUXCID(link, circuit, lvl, fmt, args ...) \
+ LOGMUXLK_(link, lvl, "[CID=%" PRIu8 ",batched=%u/%u] " fmt, \
+ (circuit)->ccid, (circuit)->nmsgs, (link)->h->batch_factor, ## args)
+
+/*! \addtogroup osmux Osmocom Multiplex Protocol
+ * @{
+ *
+ * This code implements a variety of utility functions related to the
+ * OSMUX user-plane multiplexing protocol, an efficient alternative to
+ * plain UDP/RTP streams for voice transport in back-haul of cellular
+ * networks.
+ *
+ * For information about the OSMUX protocol design, please see the
+ * OSMUX reference manual at
+ * http://ftp.osmocom.org/docs/latest/osmux-reference.pdf
+ */
+
+/*! \file osmux_input.c
+ * \brief Osmocom multiplex protocol helpers (input)
+ */
+
+static void *osmux_ctx;
+
+static uint32_t osmux_ft_dummy_size(uint8_t amr_ft, uint8_t batch_factor)
+{
+ return sizeof(struct osmux_hdr) + (osmo_amr_bytes(amr_ft) * batch_factor);
+}
+
+/* This is (struct osmux_in_handle)->internal_data.
+ * TODO: API have been defined to access all fields of osmux_in_handle
+ * (deprecated osmux_xfrm_input_init()), hence at some point we remove struct
+ * osmux_in_handle definition from osmux.h and we move it here internally and
+ * merge it with struct osmux_link.
+ */
+struct osmux_link {
+ struct osmo_timer_list timer;
+ struct osmux_hdr *osmuxh;
+ struct llist_head circuit_list;
+ unsigned int remaining_bytes;
+ uint32_t nmsgs;
+ int ndummy;
+ char *name;
+ struct osmux_in_handle *h; /* backpointer to parent object */
+};
+
+struct osmux_circuit {
+ struct llist_head head;
+ int ccid;
+ struct llist_head msg_list;
+ int nmsgs;
+ int dummy;
+ uint8_t seq;
+ int32_t last_transmitted_rtp_seq; /* -1 = unset */
+ uint32_t last_transmitted_rtp_ts; /* Check last_transmitted_rtp_seq = -1 to detect unset */
+};
+
+/* Used internally to temporarily cache all parsed content of an RTP pkt from user to be transmitted as Osmux */
+struct osmux_in_req {
+ struct osmux_circuit *circuit;
+ struct msgb *msg;
+ struct rtp_hdr *rtph;
+ uint32_t rtp_payload_len;
+ struct amr_hdr *amrh;
+ int amr_payload_len;
+};
+
+/* returns: 1 if batch is full, 0 if batch still not full, negative on error. */
+static int osmux_circuit_enqueue(struct osmux_link *link, struct osmux_circuit *circuit, struct msgb *msg)
+{
+ /* Validate amount of messages per batch. The counter field of the
+ * osmux header is just 3 bits long, so make sure it doesn't overflow.
+ */
+ OSMO_ASSERT(link->h->batch_factor <= 8);
+ if (circuit->nmsgs >= link->h->batch_factor) {
+ struct rtp_hdr *rtph;
+
+ rtph = osmo_rtp_get_hdr(msg);
+ if (rtph == NULL)
+ return -1;
+
+ LOGMUXCID(link, circuit, LOGL_DEBUG, "Batch is full for RTP sssrc=%u\n", rtph->ssrc);
+ return 1;
+ }
+
+ llist_add_tail(&msg->list, &circuit->msg_list);
+ circuit->nmsgs++;
+ return 0;
+}
+
+static void osmux_circuit_dequeue(struct osmux_circuit *circuit, struct msgb *msg)
+{
+ llist_del(&msg->list);
+ circuit->nmsgs--;
+}
+
+static void osmux_circuit_del_msgs(struct osmux_link *link, struct osmux_circuit *circuit)
+{
+ struct msgb *cur, *tmp;
+ llist_for_each_entry_safe(cur, tmp, &circuit->msg_list, list) {
+ osmux_circuit_dequeue(circuit, cur);
+ msgb_free(cur);
+ link->nmsgs--;
+ }
+}
+
+struct osmux_input_state {
+ struct msgb *out_msg;
+ struct msgb *msg;
+ struct rtp_hdr *rtph;
+ struct amr_hdr *amrh;
+ uint32_t amr_payload_len;
+ struct osmux_circuit *circuit;
+ int add_osmux_hdr;
+};
+
+static int osmux_link_put(struct osmux_link *link, struct osmux_input_state *state)
+{
+ uint16_t rtp_seqnum = ntohs(state->rtph->sequence);
+
+ if (state->add_osmux_hdr) {
+ bool seq_jump = state->circuit->last_transmitted_rtp_seq != -1 &&
+ ((state->circuit->last_transmitted_rtp_seq + 1) & 0xffff) != rtp_seqnum;
+ struct osmux_hdr *osmuxh;
+ osmuxh = (struct osmux_hdr *)msgb_put(state->out_msg,
+ sizeof(struct osmux_hdr));
+ osmuxh->ft = OSMUX_FT_VOICE_AMR;
+ osmuxh->ctr = 0;
+ osmuxh->rtp_m = state->rtph->marker || seq_jump;
+ osmuxh->seq = state->circuit->seq++;
+ osmuxh->circuit_id = state->circuit->ccid;
+ osmuxh->amr_ft = state->amrh->ft;
+
+ /* annotate current osmux header */
+ link->osmuxh = osmuxh;
+ } else {
+ if (link->osmuxh->ctr == 0x7) {
+ LOGMUXCID(link, state->circuit, LOGL_ERROR,
+ "Cannot encode RTP pkt ssrc=%u into osmux batch, too many packets\n",
+ state->rtph->ssrc);
+ return 0;
+ }
+ link->osmuxh->ctr++;
+ }
+ /* For fields below, we only use the last included in batch and ignore any previous: */
+ link->osmuxh->amr_cmr = state->amrh->cmr;
+ link->osmuxh->amr_f = state->amrh->f;
+ link->osmuxh->amr_q = state->amrh->q;
+
+ if (state->amr_payload_len > 0) {
+ memcpy(state->out_msg->tail, osmo_amr_get_payload(state->amrh),
+ state->amr_payload_len);
+ msgb_put(state->out_msg, state->amr_payload_len);
+ }
+
+ /* Update circuit state of last transmitted incoming RTP seqnum/ts: */
+ state->circuit->last_transmitted_rtp_seq = rtp_seqnum;
+ state->circuit->last_transmitted_rtp_ts = ntohl(state->rtph->timestamp);
+ return 0;
+}
+
+static void osmux_encode_dummy(struct osmux_link *link, struct osmux_input_state *state)
+{
+ struct osmux_hdr *osmuxh;
+ /* TODO: This should be configurable at some point. */
+ uint32_t payload_size = osmux_ft_dummy_size(AMR_FT_3, link->h->batch_factor) -
+ sizeof(struct osmux_hdr);
+
+ osmuxh = (struct osmux_hdr *)state->out_msg->tail;
+ osmuxh->ft = OSMUX_FT_DUMMY;
+ osmuxh->ctr = link->h->batch_factor - 1;
+ osmuxh->amr_f = 0;
+ osmuxh->amr_q = 0;
+ osmuxh->seq = 0;
+ osmuxh->circuit_id = state->circuit->ccid;
+ osmuxh->amr_cmr = 0;
+ osmuxh->amr_ft = AMR_FT_3;
+ msgb_put(state->out_msg, sizeof(struct osmux_hdr));
+
+ memset(state->out_msg->tail, 0xff, payload_size);
+ msgb_put(state->out_msg, payload_size);
+}
+
+static struct msgb *osmux_build_batch(struct osmux_link *link)
+{
+ struct msgb *batch_msg;
+ struct osmux_circuit *circuit;
+
+#ifdef DEBUG_MSG
+ LOGMUXLK(link, LOGL_DEBUG, "Now building batch\n");
+#endif
+
+ batch_msg = msgb_alloc(link->h->batch_size, "osmux");
+ if (batch_msg == NULL) {
+ LOGMUXLK(link, LOGL_ERROR, "Not enough memory\n");
+ return NULL;
+ }
+
+ llist_for_each_entry(circuit, &link->circuit_list, head) {
+ struct msgb *cur, *tmp;
+ int ctr = 0;
+ int prev_amr_ft;
+
+ if (circuit->dummy) {
+ struct osmux_input_state state = {
+ .out_msg = batch_msg,
+ .circuit = circuit,
+ };
+ osmux_encode_dummy(link, &state);
+ continue;
+ }
+
+ llist_for_each_entry_safe(cur, tmp, &circuit->msg_list, list) {
+ struct osmux_input_state state = {
+ .msg = cur,
+ .out_msg = batch_msg,
+ .circuit = circuit,
+ };
+ uint32_t amr_len;
+#ifdef DEBUG_MSG
+ char buf[4096];
+
+ osmo_rtp_snprintf(buf, sizeof(buf), cur);
+ buf[sizeof(buf)-1] = '\0';
+ LOGMUXCID(link, circuit, LOGL_DEBUG, "to BSC-NAT: %s\n", buf);
+#endif
+
+ state.rtph = osmo_rtp_get_hdr(cur);
+ if (!state.rtph)
+ return NULL;
+ state.amrh = osmo_rtp_get_payload(state.rtph, state.msg, &amr_len);
+ if (!state.amrh)
+ return NULL;
+ state.amr_payload_len = amr_len - sizeof(struct amr_hdr);
+
+ if (ctr == 0) {
+#ifdef DEBUG_MSG
+ LOGMUXCID(link, circuit, LOGL_DEBUG, "Add osmux header (First in batch)\n");
+#endif
+ state.add_osmux_hdr = 1;
+ } else if (prev_amr_ft != state.amrh->ft) {
+ /* If AMR FT changed, we have to generate an extra batch osmux header: */
+#ifdef DEBUG_MSG
+ LOGMUXCID(link, circuit, LOGL_DEBUG, "Add osmux header (New AMR FT)\n");
+#endif
+ state.add_osmux_hdr = 1;
+ }
+
+ osmux_link_put(link, &state);
+ osmux_circuit_dequeue(circuit, cur);
+ prev_amr_ft = state.amrh->ft;
+ ctr++;
+ msgb_free(cur);
+ link->nmsgs--;
+ }
+ }
+ return batch_msg;
+}
+
+void osmux_xfrm_input_deliver(struct osmux_in_handle *h)
+{
+ struct msgb *batch_msg;
+ struct osmux_link *link = (struct osmux_link *)h->internal_data;
+
+#ifdef DEBUG_MSG
+ LOGMUXLK(link, LOGL_DEBUG, "Invoking delivery function\n");
+#endif
+ batch_msg = osmux_build_batch(link);
+ if (!batch_msg)
+ return;
+ h->stats.output_osmux_msgs++;
+ h->stats.output_osmux_bytes += batch_msg->len;
+
+ h->deliver(batch_msg, h->data);
+ osmo_timer_del(&link->timer);
+ link->remaining_bytes = h->batch_size;
+
+ if (link->ndummy)
+ osmo_timer_schedule(&link->timer, 0, h->batch_factor * DELTA_RTP_MSG);
+}
+
+static void osmux_link_timer_expired(void *data)
+{
+ struct osmux_in_handle *h = data;
+
+#ifdef DEBUG_MSG
+ const struct osmux_link *link = (struct osmux_link *)h->internal_data;
+ LOGMUXLK(link, LOGL_DEBUG, "Batch delivery timer timeout\n");
+#endif
+ osmux_xfrm_input_deliver(h);
+}
+
+static int osmux_rtp_amr_payload_len(struct amr_hdr *amrh, uint32_t amr_len)
+{
+ int amr_payload_len;
+
+ if (!osmo_amr_ft_valid(amrh->ft))
+ return -1;
+
+ amr_payload_len = amr_len - sizeof(struct amr_hdr);
+
+ /* The AMR payload does not fit with what we expect */
+ if (osmo_amr_bytes(amrh->ft) != amr_payload_len) {
+ LOGP(DLMUX, LOGL_ERROR,
+ "Bad AMR frame FT=%u, expected %zd bytes, got %d bytes\n",
+ amrh->ft, osmo_amr_bytes(amrh->ft), amr_len);
+ return -1;
+ }
+ return amr_payload_len;
+}
+
+/* Last stored AMR FT to be added in the current osmux batch. -1 if none stored yet */
+static int osmux_circuit_get_last_stored_amr_ft(struct osmux_circuit *circuit)
+{
+ struct msgb *last;
+ struct rtp_hdr *rtph;
+ struct amr_hdr *amrh;
+ uint32_t amr_len;
+ /* Have we seen any RTP packet in this batch before? */
+ if (llist_empty(&circuit->msg_list))
+ return -1;
+ OSMO_ASSERT(circuit->nmsgs > 0);
+
+ /* Get last RTP packet seen in this batch */
+ last = llist_entry(circuit->msg_list.prev, struct msgb, list);
+ rtph = osmo_rtp_get_hdr(last);
+ amrh = osmo_rtp_get_payload(rtph, last, &amr_len);
+ if (amrh == NULL)
+ return -1;
+ return amrh->ft;
+
+}
+
+static struct osmux_circuit *
+osmux_link_find_circuit(struct osmux_link *link, int ccid)
+{
+ struct osmux_circuit *circuit;
+
+ llist_for_each_entry(circuit, &link->circuit_list, head) {
+ if (circuit->ccid == ccid)
+ return circuit;
+ }
+ return NULL;
+}
+
+static void osmux_link_del_circuit(struct osmux_link *link, struct osmux_circuit *circuit)
+{
+ if (circuit->dummy)
+ link->ndummy--;
+ llist_del(&circuit->head);
+ osmux_circuit_del_msgs(link, circuit);
+ talloc_free(circuit);
+}
+
+/* returns: 1 if batch is full, 0 if batch still not full, negative on error. */
+static int osmux_link_add(struct osmux_link *link, const struct osmux_in_req *req)
+{
+ unsigned int needed_bytes = 0;
+ int rc;
+ /* Init of talkspurt (RTP M marker bit) needs to be in the first AMR slot
+ * of the OSMUX packet, enforce sending previous batch if required:
+ */
+ if (req->rtph->marker && req->circuit->nmsgs != 0)
+ return 1;
+
+ /* First check if there is room for this message in the batch */
+ /* First in batch comes after the batch header: */
+ if (req->circuit->nmsgs == 0)
+ needed_bytes += sizeof(struct osmux_hdr);
+ /* If AMR FT changes in the middle of current batch a new header is
+ * required to adapt to size change: */
+ else if (osmux_circuit_get_last_stored_amr_ft(req->circuit) != req->amrh->ft)
+ needed_bytes += sizeof(struct osmux_hdr);
+ needed_bytes += req->amr_payload_len;
+
+ /* No room, sorry. You'll have to retry */
+ if (needed_bytes > link->remaining_bytes)
+ return 1;
+
+ /* This batch is full, force batch delivery */
+ rc = osmux_circuit_enqueue(link, req->circuit, req->msg);
+ if (rc != 0)
+ return rc;
+
+#ifdef DEBUG_MSG
+ LOGMUXCID(link, req->circuit, LOGL_DEBUG, "Adding msg with ssrc=%u to batch\n",
+ req->rtph->ssrc);
+#endif
+
+ /* Update remaining room in this batch */
+ link->remaining_bytes -= needed_bytes;
+
+ if (link->nmsgs == 0) {
+#ifdef DEBUG_MSG
+ LOGMUXLK(link, LOGL_DEBUG, "Osmux start batch delivery timer\n");
+#endif
+ osmo_timer_schedule(&link->timer, 0,
+ link->h->batch_factor * DELTA_RTP_MSG);
+ }
+ link->nmsgs++;
+
+ return 0;
+};
+
+/* returns: 1 if batch is full, 0 if batch still not full, negative on error. */
+static int osmux_replay_lost_packets(struct osmux_link *link, const struct osmux_in_req *req)
+{
+ int16_t diff;
+ uint16_t lost_pkts;
+ struct msgb *copy_from;
+ uint16_t last_seq, cur_seq;
+ uint32_t last_ts;
+ int i, rc;
+ struct osmux_in_req clone_req;
+
+ /* If M bit is set, this is a sync point, so any sort of seq jump is expected and has no real meaning. */
+ if (req->rtph->marker)
+ return 0;
+
+ /* Have we seen any RTP packet in this batch before? */
+ if (llist_empty(&req->circuit->msg_list)) {
+ /* Since current batch is empty, it can be assumed:
+ * 1- circuit->last_transmitted_rtp_seq is either unset or really contains the last RTP enqueued
+ * 2- This pkt will generate an osmuxhdr and hence there's no
+ * restriction on the FT, as opposite to the case where the batch
+ * is half full
+ * Conclusion:
+ * 1- It is fine using circuit->last_transmitted_rtp_seq as last enqueued RTP header to detect seqnum jumps.
+ * 2- It is fine filling holes at the start of the batch by using current req->rtph.
+ */
+ if (req->circuit->last_transmitted_rtp_seq == -1)
+ return 0; /* first message in circuit, do nothing */
+ copy_from = req->msg;
+ last_seq = req->circuit->last_transmitted_rtp_seq;
+ last_ts = req->circuit->last_transmitted_rtp_ts;
+ } else {
+ /* Get last RTP packet seen in this batch, so that we simply keep filling with same osmuxhdr */
+ struct rtp_hdr *last_rtph;
+ copy_from = llist_entry(req->circuit->msg_list.prev, struct msgb, list);
+ last_rtph = osmo_rtp_get_hdr(copy_from);
+ if (last_rtph == NULL)
+ return -1;
+ last_seq = ntohs(last_rtph->sequence);
+ last_ts = ntohl(last_rtph->timestamp);
+ }
+ cur_seq = ntohs(req->rtph->sequence);
+ diff = cur_seq - last_seq;
+
+ /* If diff between last RTP packet seen and this one is > 1,
+ * then we lost several RTP packets, let's replay them.
+ */
+ if (diff <= 1)
+ return 0;
+ lost_pkts = diff - 1;
+
+ LOGMUXCID(link, req->circuit, LOGL_INFO,
+ "RTP seq jump detected: %" PRIu16 " -> %" PRIu16 " (%" PRId16
+ " lost packets)\n",
+ last_seq, cur_seq, lost_pkts);
+
+ /* We know we can feed only up to batch_factor before osmux_link_add()
+ * returning 1 signalling "transmission needed, call deliver() and retry".
+ * Hence, it doesn't make sense to even attempt recreating a big number of
+ * RTP packets (>batch_factor).
+ */
+ if (lost_pkts > link->h->batch_factor - req->circuit->nmsgs) {
+ if (llist_empty(&req->circuit->msg_list)) {
+ /* If we are starting a batch, it doesn't make sense to keep filling entire
+ * batches with lost packets, since it could potentially end up in a loop if
+ * the lost_pkts value is huge. Instead, avoid recreating packets and let the
+ * osmux encoder set an M bit on the osmuxhdr when acting upon current req->rtph.
+ */
+ return 0;
+ }
+ lost_pkts = link->h->batch_factor - req->circuit->nmsgs;
+ }
+
+ rc = 0;
+ clone_req = *req;
+ for (i = 0; i < lost_pkts; i++) {
+ /* Clone last (or new if last not available) RTP packet seen */
+ clone_req.msg = msgb_copy(copy_from, "RTP clone");
+ if (!clone_req.msg)
+ continue;
+
+ /* The original RTP message has been already sanity checked. */
+ clone_req.rtph = osmo_rtp_get_hdr(clone_req.msg);
+ clone_req.amrh = osmo_rtp_get_payload(clone_req.rtph, clone_req.msg, &clone_req.rtp_payload_len);
+ clone_req.amr_payload_len = osmux_rtp_amr_payload_len(clone_req.amrh, clone_req.rtp_payload_len);
+
+ /* Faking a follow up RTP pkt here, so no Marker bit: */
+ clone_req.rtph->marker = false;
+ /* Adjust sequence number and timestamp */
+ clone_req.rtph->sequence = htons(last_seq + 1 + i);
+ clone_req.rtph->timestamp = last_ts + ((1 + i) * DELTA_RTP_TIMESTAMP);
+ rc = osmux_link_add(link, &clone_req);
+ /* No more room in this batch, skip padding with more clones */
+ if (rc != 0) {
+ msgb_free(clone_req.msg);
+ return rc;
+ }
+ }
+ return rc;
+}
+
+/* returns: 1 if batch is full, 0 if batch still not full, negative on error. */
+static int osmux_link_handle_rtp_req(struct osmux_link *link, struct osmux_in_req *req)
+{
+ struct msgb *cur, *next;
+ int rc;
+
+ /* We've seen the first RTP message, disable dummy padding */
+ if (req->circuit->dummy) {
+ req->circuit->dummy = 0;
+ link->ndummy--;
+ }
+
+ /* Extra validation: check if this message already exists, should not
+ * happen but make sure we don't propagate duplicated messages.
+ */
+ llist_for_each_entry_safe(cur, next, &req->circuit->msg_list, list) {
+ struct rtp_hdr *rtph2 = osmo_rtp_get_hdr(cur);
+ OSMO_ASSERT(rtph2);
+
+ /* Already exists message with this sequence. Let's copy over
+ * the new RTP, since there's the chance that the existing one may
+ * be a forged copy we did when we detected a hole. */
+ if (rtph2->sequence == req->rtph->sequence) {
+ if (msgb_length(cur) != msgb_length(req->msg)) {
+ /* Different packet size, AMR FT may have changed. Let's avoid changing it to
+ * break accounted size to be written (would need new osmux_hdr, etc.) */
+ LOGMUXCID(link, req->circuit, LOGL_NOTICE,
+ "RTP pkt with seq=%u and different len %u != %u already exists, skip it\n",
+ ntohs(req->rtph->sequence), msgb_length(cur), msgb_length(req->msg));
+ return -1;
+ }
+ LOGMUXCID(link, req->circuit, LOGL_INFO,
+ "RTP pkt with seq=%u already exists, replace it\n",
+ ntohs(req->rtph->sequence));
+ __llist_add(&req->msg->list, &cur->list, cur->list.next);
+ llist_del(&cur->list);
+ msgb_free(cur);
+ return 0;
+ }
+ }
+
+ /* Handle RTP packet loss scenario */
+ rc = osmux_replay_lost_packets(link, req);
+ if (rc != 0)
+ return rc;
+
+ return osmux_link_add(link, req);
+}
+
+/**
+ * osmux_xfrm_input - add RTP message to OSmux batch
+ * \param msg: RTP message that you want to batch into one OSmux message
+ *
+ * If 0 is returned, this indicates that the message has been batched and the
+ * msgb is now owned by the osmux layer.
+ * If negative value is returned, an error occurred and the message has been
+ * dropped (and freed).
+ * If 1 is returned, you have to invoke osmux_xfrm_input_deliver and try again.
+ *
+ * The function takes care of releasing the messages in case of error and
+ * when building the batch.
+ */
+int osmux_xfrm_input(struct osmux_in_handle *h, struct msgb *msg, int ccid)
+{
+ int ret;
+ struct osmux_link *link = (struct osmux_link *)h->internal_data;
+ struct osmux_in_req req = {
+ .msg = msg,
+ .rtph = osmo_rtp_get_hdr(msg),
+ .circuit = osmux_link_find_circuit(link, ccid),
+ };
+
+ if (!req.circuit) {
+ LOGMUXLK(link, LOGL_INFO, "Couldn't find circuit CID=%u\n", ccid);
+ goto err_free;
+ }
+
+ if (!req.rtph) {
+ LOGMUXCID(link, req.circuit, LOGL_NOTICE, "msg not containing an RTP header\n");
+ goto err_free;
+ }
+
+ /* Ignore too big RTP/RTCP messages, most likely forged. Sanity check
+ * to avoid a possible forever loop in the caller.
+ */
+ if (msg->len > h->batch_size - sizeof(struct osmux_hdr)) {
+ LOGMUXCID(link, req.circuit, LOGL_NOTICE,
+ "RTP payload too big (%u) for configured batch size (%u)\n",
+ msg->len, h->batch_size);
+ goto err_free;
+ }
+
+ switch (req.rtph->payload_type) {
+ case RTP_PT_RTCP:
+ LOGMUXCID(link, req.circuit, LOGL_INFO, "Dropping RTCP packet\n");
+ msgb_free(msg);
+ return 0;
+ default:
+ /* The RTP payload type is dynamically allocated,
+ * although we use static ones. Assume that we always
+ * receive AMR traffic.
+ */
+ req.amrh = osmo_rtp_get_payload(req.rtph, req.msg, &req.rtp_payload_len);
+ if (req.amrh == NULL)
+ goto err_free;
+ req.amr_payload_len = osmux_rtp_amr_payload_len(req.amrh, req.rtp_payload_len);
+ if (req.amr_payload_len < 0) {
+ LOGMUXCID(link, req.circuit, LOGL_NOTICE, "AMR payload invalid\n");
+ goto err_free;
+ }
+
+ /* Add this RTP to the OSMUX batch */
+ ret = osmux_link_handle_rtp_req(link, &req);
+ if (ret < 0) {
+ /* Cannot put this message into the batch.
+ * Malformed, duplicated, OOM. Drop it and tell
+ * the upper layer that we have digest it.
+ */
+ LOGMUXCID(link, req.circuit, LOGL_DEBUG, "Dropping RTP packet instead of adding to batch\n");
+ goto err_free;
+ }
+
+ h->stats.input_rtp_msgs++;
+ h->stats.input_rtp_bytes += msg->len;
+ break;
+ }
+ return ret;
+
+err_free:
+ msgb_free(msg);
+ return -1;
+}
+
+static int osmux_xfrm_input_talloc_destructor(struct osmux_in_handle *h)
+{
+ struct osmux_link *link = (struct osmux_link *)h->internal_data;
+ struct osmux_circuit *circuit, *next;
+
+ llist_for_each_entry_safe(circuit, next, &link->circuit_list, head)
+ osmux_link_del_circuit(link, circuit);
+
+ osmo_timer_del(&link->timer);
+ talloc_free(link);
+ return 0;
+}
+
+static unsigned int next_default_name_idx = 0;
+/*! \brief Allocate a new osmux in handle (osmux source, tx side)
+ * \param[in] ctx talloc context to use when allocating the returned struct
+ * \return Allocated osmux in handle
+ *
+ * This object contains configuration and state to handle a group of circuits (trunk),
+ * receiving RTP packets from the upper layer (API user) and sending batched &
+ * trunked Osmux messages containing all the data of those circuits down the
+ * stack outgoing network Osmux messages.
+ * Returned pointer can be freed with regular talloc_free, all pending messages
+ * in queue and all internal data will be freed. */
+struct osmux_in_handle *osmux_xfrm_input_alloc(void *ctx)
+{
+ struct osmux_in_handle *h;
+ struct osmux_link *link;
+
+ h = talloc_zero(ctx, struct osmux_in_handle);
+ OSMO_ASSERT(h);
+
+ h->batch_size = OSMUX_BATCH_DEFAULT_MAX;
+
+ link = talloc_zero(h, struct osmux_link);
+ OSMO_ASSERT(link);
+ INIT_LLIST_HEAD(&link->circuit_list);
+ link->h = h;
+ link->remaining_bytes = h->batch_size;
+ link->name = talloc_asprintf(link, "input-%u", next_default_name_idx++);
+ osmo_timer_setup(&link->timer, osmux_link_timer_expired, h);
+
+ h->internal_data = (void *)link;
+
+ LOGMUXLK(link, LOGL_DEBUG, "Initialized osmux input converter\n");
+
+ talloc_set_destructor(h, osmux_xfrm_input_talloc_destructor);
+ return h;
+}
+
+/*! \deprecated: Use osmux_xfrm_input_alloc() instead */
+void osmux_xfrm_input_init(struct osmux_in_handle *h)
+{
+ struct osmux_link *link;
+
+ /* Default to osmux packet size if not specified */
+ if (h->batch_size == 0)
+ h->batch_size = OSMUX_BATCH_DEFAULT_MAX;
+
+ link = talloc_zero(osmux_ctx, struct osmux_link);
+ if (link == NULL)
+ return;
+ INIT_LLIST_HEAD(&link->circuit_list);
+ link->h = h;
+ link->remaining_bytes = h->batch_size;
+ link->name = talloc_asprintf(link, "%u", next_default_name_idx++);
+ osmo_timer_setup(&link->timer, osmux_link_timer_expired, h);
+
+ h->internal_data = (void *)link;
+
+ LOGMUXLK(link, LOGL_DEBUG, "Initialized osmux input converter\n");
+}
+
+int osmux_xfrm_input_set_batch_factor(struct osmux_in_handle *h, uint8_t batch_factor)
+{
+ if (batch_factor > 8)
+ return -1;
+ h->batch_factor = batch_factor;
+ return 0;
+}
+
+void osmux_xfrm_input_set_batch_size(struct osmux_in_handle *h, uint16_t batch_size)
+{
+ if (batch_size == 0)
+ h->batch_size = OSMUX_BATCH_DEFAULT_MAX;
+ else
+ h->batch_size = batch_size;
+}
+
+void osmux_xfrm_input_set_initial_seqnum(struct osmux_in_handle *h, uint8_t osmux_seqnum)
+{
+ h->osmux_seq = osmux_seqnum;
+}
+
+void osmux_xfrm_input_set_deliver_cb(struct osmux_in_handle *h,
+ void (*deliver_cb)(struct msgb *msg, void *data), void *data)
+{
+ h->deliver = deliver_cb;
+ h->data = data;
+}
+
+void *osmux_xfrm_input_get_deliver_cb_data(struct osmux_in_handle *h)
+{
+ return h->data;
+}
+
+void osmux_xfrm_input_set_name(struct osmux_in_handle *h, const char *name)
+{
+ struct osmux_link *link = (struct osmux_link *)h->internal_data;
+ osmo_talloc_replace_string(link, &link->name, name);
+}
+
+int osmux_xfrm_input_open_circuit(struct osmux_in_handle *h, int ccid,
+ int dummy)
+{
+ struct osmux_link *link = (struct osmux_link *)h->internal_data;
+ struct osmux_circuit *circuit;
+
+ circuit = osmux_link_find_circuit(link, ccid);
+ if (circuit != NULL) {
+ LOGMUXLK(link, LOGL_ERROR, "circuit %u already exists!\n", ccid);
+ return -1;
+ }
+
+ circuit = talloc_zero(osmux_ctx, struct osmux_circuit);
+ if (circuit == NULL) {
+ LOGMUXLK(link, LOGL_ERROR, "OOM on circuit %u\n", ccid);
+ return -1;
+ }
+
+ circuit->ccid = ccid;
+ circuit->seq = h->osmux_seq;
+ circuit->last_transmitted_rtp_seq = -1; /* field unset */
+ INIT_LLIST_HEAD(&circuit->msg_list);
+ llist_add_tail(&circuit->head, &link->circuit_list);
+
+ if (dummy) {
+ circuit->dummy = dummy;
+ link->ndummy++;
+ if (!osmo_timer_pending(&link->timer))
+ osmo_timer_schedule(&link->timer, 0,
+ h->batch_factor * DELTA_RTP_MSG);
+ }
+ LOGMUXCID(link, circuit, LOGL_INFO, "Circuit opened successfully\n");
+ return 0;
+}
+
+void osmux_xfrm_input_close_circuit(struct osmux_in_handle *h, int ccid)
+{
+ struct osmux_link *link = (struct osmux_link *)h->internal_data;
+ struct osmux_circuit *circuit;
+
+ circuit = osmux_link_find_circuit(link, ccid);
+ if (circuit == NULL) {
+ LOGMUXLK(link, LOGL_NOTICE, "Unable to close circuit %d: Not found\n",
+ ccid);
+ return;
+ }
+
+ LOGMUXCID(link, circuit, LOGL_INFO, "Closing circuit\n");
+
+ osmux_link_del_circuit(link, circuit);
+}
+
+/*! \deprecated: Use talloc_free() instead (will call osmux_xfrm_input_talloc_destructor()) */
+void osmux_xfrm_input_fini(struct osmux_in_handle *h)
+{
+ (void)osmux_xfrm_input_talloc_destructor(h);
+}
+
+/*! @} */
diff --git a/src/osmux_output.c b/src/osmux_output.c
new file mode 100644
index 0000000..664ed60
--- /dev/null
+++ b/src/osmux_output.c
@@ -0,0 +1,396 @@
+/*
+ * (C) 2012-2017 by Pablo Neira Ayuso <pablo@gnumonks.org>
+ * (C) 2012 by On Waves ehf <http://www.on-waves.com>
+ * (C) 2015-2022 by sysmocom - s.f.m.c. GmbH
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <stdio.h>
+#include <string.h>
+
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/timer_compat.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/logging.h>
+
+#include <osmocom/netif/amr.h>
+#include <osmocom/netif/rtp.h>
+#include <osmocom/netif/osmux.h>
+
+#include <arpa/inet.h>
+
+/* delta time between two RTP messages (in microseconds) */
+#define DELTA_RTP_MSG 20000
+/* delta time between two RTP messages (in samples, 8kHz) */
+#define DELTA_RTP_TIMESTAMP 160
+
+
+/*! \addtogroup osmux Osmocom Multiplex Protocol
+ * @{
+ *
+ * This code implements a variety of utility functions related to the
+ * OSMUX user-plane multiplexing protocol, an efficient alternative to
+ * plain UDP/RTP streams for voice transport in back-haul of cellular
+ * networks.
+ *
+ * For information about the OSMUX protocol design, please see the
+ * OSMUX reference manual at
+ * http://ftp.osmocom.org/docs/latest/osmux-reference.pdf
+ */
+
+/*! \file osmux_output.c
+ * \brief Osmocom multiplex protocol helpers (output)
+ */
+static uint32_t osmux_ft_dummy_size(uint8_t amr_ft, uint8_t batch_factor)
+{
+ return sizeof(struct osmux_hdr) + (osmo_amr_bytes(amr_ft) * batch_factor);
+}
+
+struct osmux_hdr *osmux_xfrm_output_pull(struct msgb *msg)
+{
+ struct osmux_hdr *osmuxh;
+ size_t len;
+
+next:
+ if (msgb_length(msg) == 0)
+ return NULL; /* base case, we drained the msg successfully, tell user it is done. */
+
+ if (msgb_length(msg) < sizeof(struct osmux_hdr)) {
+ LOGP(DLMUX, LOGL_ERROR, "remaining %d bytes, broken osmuxhdr?\n", msgb_length(msg));
+ return NULL;
+ }
+
+ osmuxh = (struct osmux_hdr *)msgb_data(msg);
+ switch (osmuxh->ft) {
+ case OSMUX_FT_VOICE_AMR:
+ if (!osmo_amr_ft_valid(osmuxh->amr_ft)) {
+ LOGP(DLMUX, LOGL_ERROR, "Discarding bad AMR FT %d\n", osmuxh->amr_ft);
+ return NULL;
+ }
+ len = osmo_amr_bytes(osmuxh->amr_ft) * (osmuxh->ctr + 1) + sizeof(struct osmux_hdr);
+ if (msgb_length(msg) < len) {
+ LOGP(DLMUX, LOGL_ERROR,
+ "Discarding malformed OSMUX message: %s\n",
+ osmo_hexdump(msgb_data(msg), msgb_length(msg)));
+ return NULL;
+ }
+ msgb_pull(msg, len);
+ return osmuxh;
+
+ case OSMUX_FT_DUMMY:
+ if (!osmo_amr_ft_valid(osmuxh->amr_ft)) {
+ LOGP(DLMUX, LOGL_ERROR, "Discarding bad Dummy FT: amr_ft=%u\n", osmuxh->amr_ft);
+ return NULL;
+ }
+ len = osmux_ft_dummy_size(osmuxh->amr_ft, osmuxh->ctr + 1);
+ if (msgb_length(msg) < len) {
+ LOGP(DLMUX, LOGL_ERROR, "Discarding bad Dummy FT: %s\n",
+ osmo_hexdump(msgb_data(msg), msgb_length(msg)));
+ return NULL;
+ }
+ msgb_pull(msg, len);
+ goto next;
+
+ default:
+ LOGP(DLMUX, LOGL_ERROR, "Discarding unsupported Osmux FT %d\n",
+ osmuxh->ft);
+ return NULL;
+ }
+}
+
+static struct msgb *
+osmux_rebuild_rtp(struct osmux_out_handle *h, struct osmux_hdr *osmuxh,
+ void *payload, int payload_len, bool first_pkt)
+{
+ struct msgb *prev_msg, *out_msg;
+ struct timespec *prev_ts, *out_ts;
+ struct rtp_hdr *rtph;
+ struct amr_hdr *amrh;
+ struct timespec delta = { .tv_sec = 0, .tv_nsec = DELTA_RTP_MSG*1000 };
+ unsigned int msg_len = sizeof(struct rtp_hdr) +
+ sizeof(struct amr_hdr) +
+ payload_len;
+
+ if (h->rtp_msgb_alloc_cb) {
+ out_msg = h->rtp_msgb_alloc_cb(h->rtp_msgb_alloc_cb_data, msg_len);
+ } else {
+ out_msg = msgb_alloc(msg_len, "osmux-rtp");
+ }
+ if (out_msg == NULL)
+ return NULL;
+
+ /* Reconstruct RTP header */
+ rtph = (struct rtp_hdr *)out_msg->data;
+ rtph->csrc_count = 0;
+ rtph->extension = 0;
+ rtph->version = RTP_VERSION;
+ rtph->payload_type = h->rtp_payload_type;
+ /* ... emulate timestamp and ssrc */
+ rtph->timestamp = htonl(h->rtp_timestamp);
+ rtph->sequence = htons(h->rtp_seq);
+ rtph->ssrc = htonl(h->rtp_ssrc);
+ /* rtp packet with the marker bit is always guaranteed to be the first
+ * one. We want to notify with marker in 2 scenarios:
+ * 1- Sender told us through osmux frame rtp_m.
+ * 2- Intermediate osmux frame lost (seq gap), otherwise rtp receiver only sees
+ * steady increase of delay
+ */
+ rtph->marker = first_pkt &&
+ (osmuxh->rtp_m || (osmuxh->seq != ((h->osmux_seq_ack + 1) & 0xff)));
+
+ msgb_put(out_msg, sizeof(struct rtp_hdr));
+
+ /* Reconstruct AMR header */
+ amrh = (struct amr_hdr *)out_msg->tail;
+ amrh->cmr = osmuxh->amr_cmr;
+ amrh->f = osmuxh->amr_f;
+ amrh->ft = osmuxh->amr_ft;
+ amrh->q = osmuxh->amr_q;
+
+ msgb_put(out_msg, sizeof(struct amr_hdr));
+
+ /* add AMR speech data */
+ if (payload_len > 0) {
+ memcpy(out_msg->tail, payload, payload_len);
+ msgb_put(out_msg, payload_len);
+ }
+
+ /* bump last RTP sequence number and timestamp that has been used */
+ h->rtp_seq++;
+ h->rtp_timestamp += DELTA_RTP_TIMESTAMP;
+
+ out_ts = ((struct timespec *)&((out_msg)->cb[0]));
+ if (first_pkt || llist_empty(&h->list)) {
+ osmo_clock_gettime(CLOCK_MONOTONIC, out_ts);
+ } else {
+ prev_msg = llist_last_entry(&h->list, struct msgb, list);
+ prev_ts = ((struct timespec *)&((prev_msg)->cb[0]));
+ timespecadd(prev_ts, &delta, out_ts);
+ }
+
+ return out_msg;
+}
+
+static void osmux_xfrm_output_trigger(void *data)
+{
+ struct osmux_out_handle *h = data;
+ struct timespec delay_ts, now;
+ struct msgb *msg, *next;
+
+ llist_for_each_entry_safe(msg, next, &h->list, list) {
+ osmo_clock_gettime(CLOCK_MONOTONIC, &now);
+ struct timespec *msg_ts = ((struct timespec *)&((msg)->cb[0]));
+ if (timespeccmp(msg_ts, &now, >)) {
+ timespecsub(msg_ts, &now, &delay_ts);
+ osmo_timer_schedule(&h->timer,
+ delay_ts.tv_sec, delay_ts.tv_nsec / 1000);
+ return;
+ }
+
+ /* Transmit the rtp packet */
+ llist_del(&msg->list);
+ if (h->tx_cb)
+ h->tx_cb(msg, h->data);
+ else
+ msgb_free(msg);
+ }
+}
+
+/*! \brief Generate RTP packets from osmux frame AMR payload set and schedule
+ * them for transmission at appropriate time.
+ * \param[in] h the osmux out handle handling a specific CID
+ * \param[in] osmuxh Buffer pointing to osmux frame header structure and AMR payload
+ * \return Number of generated RTP packets
+ *
+ * The osmux frame passed to this function must be of the type OSMUX_FT_VOICE_AMR.
+ * The generated RTP packets are kept into h's internal list and sent to the
+ * callback configured through osmux_xfrm_output_set_tx_cb when are ready to be
+ * transmitted according to schedule.
+ */
+int osmux_xfrm_output_sched(struct osmux_out_handle *h, struct osmux_hdr *osmuxh)
+{
+ struct timespec now, *msg_ts;
+ struct msgb *msg;
+ int i;
+ bool was_empty = llist_empty(&h->list);
+
+ if (!was_empty) {
+ /* If we received new data it means we are behind schedule and
+ * we should flush all previous quickly */
+ osmo_clock_gettime(CLOCK_MONOTONIC, &now);
+ llist_for_each_entry(msg, &h->list, list) {
+ msg_ts = ((struct timespec *)&((msg)->cb[0]));
+ *msg_ts = now;
+ }
+ osmo_timer_schedule(&h->timer, 0, 0);
+ }
+
+ for (i = 0; i < osmuxh->ctr + 1; i++) {
+ struct rtp_hdr *rtph;
+
+ msg = osmux_rebuild_rtp(h, osmuxh,
+ osmux_get_payload(osmuxh) +
+ i * osmo_amr_bytes(osmuxh->amr_ft),
+ osmo_amr_bytes(osmuxh->amr_ft), !i);
+ if (msg == NULL)
+ continue;
+
+ rtph = osmo_rtp_get_hdr(msg);
+ if (rtph == NULL)
+ continue;
+
+ llist_add_tail(&msg->list, &h->list);
+ }
+
+ /* Update last seen seq number: */
+ h->osmux_seq_ack = osmuxh->seq;
+
+ /* In case list is still empty after parsing messages, no need to rearm */
+ if (was_empty && !llist_empty(&h->list))
+ osmux_xfrm_output_trigger(h);
+ return i;
+}
+
+/*! \brief Flush all scheduled RTP packets still pending to be transmitted
+ * \param[in] h the osmux out handle to flush
+ *
+ * This function will immediately call the transmit callback for all queued RTP
+ * packets, making sure the list ends up empty. It will also stop all internal
+ * timers to make sure the osmux_out_handle can be dropped or re-used by calling
+ * osmux_xfrm_output on it.
+ */
+void osmux_xfrm_output_flush(struct osmux_out_handle *h)
+{
+ struct msgb *msg, *next;
+
+ if (osmo_timer_pending(&h->timer))
+ osmo_timer_del(&h->timer);
+
+ llist_for_each_entry_safe(msg, next, &h->list, list) {
+ llist_del(&msg->list);
+ if (h->tx_cb)
+ h->tx_cb(msg, h->data);
+ else
+ msgb_free(msg);
+ }
+}
+
+struct osmux_tx_handle {
+ struct osmo_timer_list timer;
+ struct msgb *msg;
+ void (*tx_cb)(struct msgb *msg, void *data);
+ void *data;
+};
+
+static int osmux_xfrm_output_talloc_destructor(struct osmux_out_handle *h)
+{
+ osmux_xfrm_output_flush(h);
+ return 0;
+}
+
+/* Placeholder to avoid init code duplication while keeping backward
+ * compatilbility with deprecated osmux_xfrm_output_init{2}() APIs. */
+static void _osmux_xfrm_output_init(struct osmux_out_handle *h, uint32_t rtp_ssrc, uint8_t rtp_payload_type)
+{
+ h->rtp_seq = (uint16_t)random();
+ h->rtp_timestamp = (uint32_t)random();
+ h->rtp_ssrc = rtp_ssrc;
+ h->rtp_payload_type = rtp_payload_type;
+ INIT_LLIST_HEAD(&h->list);
+ osmo_timer_setup(&h->timer, osmux_xfrm_output_trigger, h);
+}
+
+/*! \brief Allocate a new osmux out handle
+ * \param[in] ctx talloc context to use when allocating the returned struct
+ * \return Allocated osmux out handle
+ *
+ * This object contains configuration and state to handle a specific CID in
+ * incoming network Osmux messages, repackaging the frames for that CID as RTP
+ * packets and pushing them up the protocol stack.
+ * Returned pointer can be freed with regular talloc_free, queue will be flushed
+ * and all internal data will be freed. */
+struct osmux_out_handle *osmux_xfrm_output_alloc(void *ctx)
+{
+ struct osmux_out_handle *h;
+
+ h = talloc_zero(ctx, struct osmux_out_handle);
+ OSMO_ASSERT(h);
+
+ _osmux_xfrm_output_init(h, (uint32_t)random(), 98);
+
+ talloc_set_destructor(h, osmux_xfrm_output_talloc_destructor);
+ return h;
+}
+
+/*! \deprecated: Use osmux_xfrm_output_alloc() and osmux_xfrm_output_set_rtp_*() instead */
+void osmux_xfrm_output_init2(struct osmux_out_handle *h, uint32_t rtp_ssrc, uint8_t rtp_payload_type)
+{
+ memset(h, 0, sizeof(*h));
+ _osmux_xfrm_output_init(h, rtp_ssrc, rtp_payload_type);
+}
+
+/*! \deprecated: Use osmux_xfrm_output_alloc() and osmux_xfrm_output_set_rtp_*() instead */
+void osmux_xfrm_output_init(struct osmux_out_handle *h, uint32_t rtp_ssrc)
+{
+ /* backward compatibility with old users, where 98 was harcoded in osmux_rebuild_rtp() */
+ memset(h, 0, sizeof(*h));
+ _osmux_xfrm_output_init(h, rtp_ssrc, 98);
+}
+
+/*! \brief Set transmission callback to call when a generated RTP packet is to be transmitted
+ * \param[in] h the osmux out handle handling a specific CID
+ * \param[in] osmuxh Buffer pointing to osmux frame header structure and AMR payload
+ * \return Number of generated RTP packets
+ *
+ * This Function sets the callback called by the interal timer set by
+ * osmux_xfrm_out_sched function.
+ */
+void osmux_xfrm_output_set_tx_cb(struct osmux_out_handle *h,
+ void (*tx_cb)(struct msgb *msg, void *data),
+ void *data)
+{
+ h->tx_cb = tx_cb;
+ h->data = data;
+}
+
+/*! \brief Set callback to call when an RTP packet to be generated is to be allocated
+ * \param[in] h the osmux out handle handling a specific CID
+ * \param[in] cb User defined msgb alloc function for generated RTP pkts
+ * \param[in] cb_data Opaque data pointer set by user and passed in \ref cb
+ * \return msgb structure to be used to fill in generated RTP pkt content
+ */
+void osmux_xfrm_output_set_rtp_msgb_alloc_cb(struct osmux_out_handle *h,
+ rtp_msgb_alloc_cb_t cb,
+ void *cb_data)
+{
+ h->rtp_msgb_alloc_cb = cb;
+ h->rtp_msgb_alloc_cb_data = cb_data;
+}
+
+/*! \brief Set SSRC of generated RTP packets from Osmux frames
+ * \param[in] h the osmux out handle handling a specific CID
+ * \param[in] rtp_ssrc the RTP SSRC to set
+ */
+void osmux_xfrm_output_set_rtp_ssrc(struct osmux_out_handle *h, uint32_t rtp_ssrc)
+{
+ h->rtp_ssrc = rtp_ssrc;
+}
+
+/*! \brief Set Payload Type of generated RTP packets from Osmux frames
+ * \param[in] h the osmux out handle handling a specific CID
+ * \param[in] rtp_payload_type the RTP Payload Type to set
+ */
+void osmux_xfrm_output_set_rtp_pl_type(struct osmux_out_handle *h, uint32_t rtp_payload_type)
+{
+ h->rtp_payload_type = rtp_payload_type;
+}
+
+/*! @} */
diff --git a/src/prim.c b/src/prim.c
new file mode 100644
index 0000000..eae1064
--- /dev/null
+++ b/src/prim.c
@@ -0,0 +1,473 @@
+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ * All Rights Reserved
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <inttypes.h>
+
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/socket.h>
+#include <osmocom/core/logging.h>
+
+#include <osmocom/netif/prim.h>
+#include <osmocom/netif/stream.h>
+
+struct osmo_prim_pkt_hdr {
+ uint32_t sap; /*!< Service Access Point Identifier */
+ uint16_t primitive; /*!< Primitive number */
+ uint16_t operation; /*! Primitive Operation (enum osmo_prim_operation) */
+} __attribute__ ((packed));
+
+/* Here we take advantage of the fact that sizeof(struct
+ * osmo_prim_pkt_hdr) <= sizeof(struct osmo_prim_hdr), so we don't need
+ * to allocate headroom when serializing later.
+ */
+osmo_static_assert(sizeof(struct osmo_prim_pkt_hdr) <= sizeof(struct osmo_prim_hdr),
+ osmo_prim_msgb_alloc_validate_headroom);
+
+/*! Allocate a primitive of given type and its associated msgb.
+* \param[in] sap Service Access Point
+* \param[in] primitive Primitive Number
+* \param[in] operation Primitive Operation (REQ/RESP/IND/CONF)
+* \param[in] alloc_len Total length (including struct osmo_prim_hdr) to allocate for the primitive
+* \returns Pointer to allocated prim_hdr inisde its own msgb. The osmo_prim_hdr
+* is pre-alocated & pre-filled.
+*/
+struct osmo_prim_hdr *osmo_prim_msgb_alloc(unsigned int sap, unsigned int primitive,
+ enum osmo_prim_operation operation, size_t alloc_len)
+{
+ struct msgb *msg;
+ struct osmo_prim_hdr *oph;
+
+ if (alloc_len < sizeof(*oph))
+ return NULL;
+
+ msg = msgb_alloc(alloc_len, "osmo_prim_msgb_alloc");
+ oph = (struct osmo_prim_hdr *)msgb_put(msg, sizeof(*oph));
+ osmo_prim_init(oph, sap, primitive, operation, msg);
+ msg->l2h = msg->tail;
+
+ return oph;
+}
+
+struct osmo_prim_srv_link {
+ void *priv;
+ char *addr;
+ int log_cat; /* Defaults to DLGLOBAL */
+ struct osmo_stream_srv_link *stream;
+ osmo_prim_srv_conn_cb opened_conn_cb;
+ osmo_prim_srv_conn_cb closed_conn_cb;
+ osmo_prim_srv_rx_sapi_version rx_sapi_version_cb;
+ osmo_prim_srv_rx_cb rx_cb;
+ size_t rx_msgb_alloc_len;
+};
+
+struct osmo_prim_srv {
+ void *priv;
+ struct osmo_prim_srv_link *link; /* backpointer */
+ struct osmo_stream_srv *stream;
+};
+
+/******************************
+ * CONTROL SAP
+ ******************************/
+#define OSMO_PRIM_CTL_SAPI 0xffffffff
+#define OSMO_PRIM_CTL_API_VERSION 0
+
+enum sap_ctl_prim_type {
+ SAP_CTL_PRIM_HELLO,
+ _SAP_CTL_PRIM_MAX
+};
+
+const struct value_string sap_ctl_prim_type_names[] = {
+ OSMO_VALUE_STRING(SAP_CTL_PRIM_HELLO),
+ { 0, NULL }
+};
+
+/* HNB_CTL_PRIM_HELLO.ind, UL */
+struct sap_ctl_hello_param {
+ uint32_t sapi; /* SAPI for which we negotiate version */
+ uint16_t api_version; /* The intended version */
+} __attribute__ ((packed));
+
+struct sap_ctl_prim {
+ struct osmo_prim_hdr hdr;
+ union {
+ struct sap_ctl_hello_param hello_req;
+ struct sap_ctl_hello_param hello_cnf;
+ } u;
+} __attribute__ ((packed));
+
+static struct sap_ctl_prim *_sap_ctl_makeprim_hello_cnf(uint32_t sapi, uint16_t api_version)
+{
+ struct sap_ctl_prim *ctl_prim;
+
+ ctl_prim = (struct sap_ctl_prim *)osmo_prim_msgb_alloc(
+ OSMO_PRIM_CTL_SAPI, SAP_CTL_PRIM_HELLO, PRIM_OP_CONFIRM,
+ sizeof(struct osmo_prim_hdr) + sizeof(struct sap_ctl_hello_param));
+ msgb_put(ctl_prim->hdr.msg, sizeof(struct sap_ctl_hello_param));
+ ctl_prim->u.hello_cnf.sapi = sapi;
+ ctl_prim->u.hello_cnf.api_version = api_version;
+
+ return ctl_prim;
+}
+
+/******************************
+ * osmo_prim_srv
+ ******************************/
+#define LOGSRV(srv, lvl, fmt, args...) LOGP((srv)->link->log_cat, lvl, fmt, ## args)
+
+static int _srv_sap_ctl_rx_hello_req(struct osmo_prim_srv *prim_srv, struct sap_ctl_hello_param *hello_ind)
+{
+ struct sap_ctl_prim *prim_resp;
+ int rc;
+
+ LOGSRV(prim_srv, LOGL_INFO, "Rx CTL-HELLO.req SAPI=%u API_VERSION=%u\n", hello_ind->sapi, hello_ind->api_version);
+
+ if (hello_ind->sapi == OSMO_PRIM_CTL_SAPI)
+ rc = hello_ind->api_version == OSMO_PRIM_CTL_API_VERSION ? OSMO_PRIM_CTL_API_VERSION : -1;
+ else if (prim_srv->link->rx_sapi_version_cb)
+ rc = prim_srv->link->rx_sapi_version_cb(prim_srv, hello_ind->sapi, hello_ind->api_version);
+ else /* Accept whatever version by default: */
+ rc = hello_ind->api_version;
+
+ if (rc < 0) {
+ LOGSRV(prim_srv, LOGL_ERROR,
+ "SAPI=%u API_VERSION=%u not supported! destroying connection\n",
+ hello_ind->sapi, hello_ind->api_version);
+ osmo_stream_srv_set_flush_and_destroy(prim_srv->stream);
+ return rc;
+ }
+ prim_resp = _sap_ctl_makeprim_hello_cnf(hello_ind->sapi, (uint16_t)rc);
+ LOGSRV(prim_srv, LOGL_INFO, "Tx CTL-HELLO.cnf SAPI=%u API_VERSION=%u\n",
+ hello_ind->sapi, prim_resp->u.hello_cnf.api_version);
+ rc = osmo_prim_srv_send(prim_srv, prim_resp->hdr.msg);
+ return rc;
+}
+
+static int _srv_sap_ctl_rx(struct osmo_prim_srv *prim_srv, struct osmo_prim_hdr *oph)
+{
+ switch (oph->operation) {
+ case PRIM_OP_REQUEST:
+ switch (oph->primitive) {
+ case SAP_CTL_PRIM_HELLO:
+ return _srv_sap_ctl_rx_hello_req(prim_srv, (struct sap_ctl_hello_param *)msgb_data(oph->msg));
+ default:
+ LOGSRV(prim_srv, LOGL_ERROR, "Rx unknown CTL SAP primitive %u (len=%u)\n",
+ oph->primitive, msgb_length(oph->msg));
+ return -EINVAL;
+ }
+ break;
+ case PRIM_OP_RESPONSE:
+ case PRIM_OP_INDICATION:
+ case PRIM_OP_CONFIRM:
+ default:
+ LOGSRV(prim_srv, LOGL_ERROR, "Rx CTL SAP unexpected primitive operation %s-%s (len=%u)\n",
+ get_value_string(sap_ctl_prim_type_names, oph->primitive),
+ get_value_string(osmo_prim_op_names, oph->operation),
+ msgb_length(oph->msg));
+ return -EINVAL;
+ }
+}
+
+static int _osmo_prim_srv_read_cb(struct osmo_stream_srv *srv)
+{
+ struct osmo_prim_srv *prim_srv = osmo_stream_srv_get_data(srv);
+ struct osmo_prim_pkt_hdr *pkth;
+ struct msgb *msg;
+ struct osmo_prim_hdr oph;
+ int rc;
+
+ msg = msgb_alloc_c(prim_srv, sizeof(*pkth) + prim_srv->link->rx_msgb_alloc_len,
+ "osmo_prim_srv_link_rx");
+ if (!msg)
+ return -ENOMEM;
+ rc = osmo_stream_srv_recv(srv, msg);
+ if (rc == 0)
+ goto close;
+
+ if (rc < 0) {
+ if (errno == EAGAIN) {
+ msgb_free(msg);
+ return 0;
+ }
+ goto close;
+ }
+
+ if (rc < sizeof(*pkth)) {
+ LOGSRV(prim_srv, LOGL_ERROR, "Received %d bytes on UD Socket, but primitive hdr size "
+ "is %zu, discarding\n", rc, sizeof(*pkth));
+ msgb_free(msg);
+ return 0;
+ }
+ pkth = (struct osmo_prim_pkt_hdr *)msgb_data(msg);
+
+ /* De-serialize message: */
+ osmo_prim_init(&oph, pkth->sap, pkth->primitive, pkth->operation, msg);
+ msgb_pull(msg, sizeof(*pkth));
+
+ switch (oph.sap) {
+ case OSMO_PRIM_CTL_SAPI:
+ rc = _srv_sap_ctl_rx(prim_srv, &oph);
+ break;
+ default:
+ if (prim_srv->link->rx_cb)
+ rc = prim_srv->link->rx_cb(prim_srv, &oph);
+ break;
+ }
+ /* as we always synchronously process the message in _osmo_prim_srv_link_rx() and
+ * its callbacks, we can free the message here. */
+ msgb_free(msg);
+
+ return rc;
+
+close:
+ msgb_free(msg);
+ osmo_prim_srv_close(prim_srv);
+ return -1;
+}
+
+static void osmo_prim_srv_free(struct osmo_prim_srv *prim_srv);
+static int _osmo_prim_srv_closed_cb(struct osmo_stream_srv *srv)
+{
+ struct osmo_prim_srv *prim_srv = osmo_stream_srv_get_data(srv);
+ struct osmo_prim_srv_link *prim_link = prim_srv->link;
+ if (prim_link->closed_conn_cb)
+ return prim_link->closed_conn_cb(prim_srv);
+ osmo_prim_srv_free(prim_srv);
+ return 0;
+}
+
+/*! Allocate a primitive of given type and its associated msgb.
+* \param[in] srv The osmo_prim_srv_link instance where message is to be sent through
+* \param[in] msg msgb containing osmo_prim_hdr plus extra content, allocated through \ref osmo_prim_msgb_alloc()
+* \returns zero on success, negative on error */
+int osmo_prim_srv_send(struct osmo_prim_srv *prim_srv, struct msgb *msg)
+{
+ struct osmo_prim_hdr *oph;
+ struct osmo_prim_pkt_hdr *pkth;
+ unsigned int sap;
+ unsigned int primitive;
+ enum osmo_prim_operation operation;
+
+ OSMO_ASSERT(prim_srv);
+
+ /* Serialize the oph: */
+ oph = (struct osmo_prim_hdr *)msgb_data(msg);
+ OSMO_ASSERT(oph && msgb_length(msg) >= sizeof(*oph));
+ sap = oph->sap;
+ primitive = oph->primitive;
+ operation = oph->operation;
+ msgb_pull(msg, sizeof(*oph));
+ pkth = (struct osmo_prim_pkt_hdr *)msgb_push(msg, sizeof(*pkth));
+ pkth->sap = sap;
+ pkth->primitive = primitive;
+ pkth->operation = operation;
+
+ /* Finally enqueue the msg */
+ osmo_stream_srv_send(prim_srv->stream, msg);
+
+ return 0;
+}
+
+static struct osmo_prim_srv *osmo_prim_srv_alloc(struct osmo_prim_srv_link *prim_link, int fd)
+{
+ struct osmo_prim_srv *prim_srv;
+ prim_srv = talloc_zero(prim_link, struct osmo_prim_srv);
+ if (!prim_srv)
+ return NULL;
+ prim_srv->link = prim_link;
+ prim_srv->stream = osmo_stream_srv_create(prim_link, prim_link->stream, fd,
+ _osmo_prim_srv_read_cb,
+ _osmo_prim_srv_closed_cb,
+ prim_srv);
+ if (!prim_srv->stream) {
+ talloc_free(prim_srv);
+ return NULL;
+ }
+ /* Inherit link priv pointer by default, user can later set it through API: */
+ prim_srv->priv = prim_link->priv;
+ return prim_srv;
+}
+
+static void osmo_prim_srv_free(struct osmo_prim_srv *prim_srv)
+{
+ talloc_free(prim_srv);
+}
+
+void osmo_prim_srv_set_name(struct osmo_prim_srv *prim_srv, const char *name)
+{
+ osmo_stream_srv_set_name(prim_srv->stream, name);
+}
+
+struct osmo_prim_srv_link *osmo_prim_srv_get_link(struct osmo_prim_srv *prim_srv)
+{
+ return prim_srv->link;
+}
+
+void osmo_prim_srv_set_priv(struct osmo_prim_srv *prim_srv, void *priv)
+{
+ prim_srv->priv = priv;
+}
+
+void *osmo_prim_srv_get_priv(const struct osmo_prim_srv *prim_srv)
+{
+ return prim_srv->priv;
+}
+
+void osmo_prim_srv_close(struct osmo_prim_srv *prim_srv)
+{
+ osmo_stream_srv_destroy(prim_srv->stream);
+ /* we free prim_srv in _osmo_prim_srv_closed_cb() */
+}
+
+/******************************
+ * osmo_prim_srv_link
+ ******************************/
+
+#define LOGSRVLINK(srv, lvl, fmt, args...) LOGP((srv)->log_cat, lvl, fmt, ## args)
+
+/* accept connection coming from PCU */
+static int _osmo_prim_srv_link_accept(struct osmo_stream_srv_link *link, int fd)
+{
+ struct osmo_prim_srv *prim_srv;
+ struct osmo_prim_srv_link *prim_link = osmo_stream_srv_link_get_data(link);
+
+ prim_srv = osmo_prim_srv_alloc(prim_link, fd);
+
+ if (prim_link->opened_conn_cb)
+ return prim_link->opened_conn_cb(prim_srv);
+
+ return 0;
+}
+
+struct osmo_prim_srv_link *osmo_prim_srv_link_alloc(void *ctx)
+{
+ struct osmo_prim_srv_link *prim_link;
+ prim_link = talloc_zero(ctx, struct osmo_prim_srv_link);
+ if (!prim_link)
+ return NULL;
+ prim_link->stream = osmo_stream_srv_link_create(prim_link);
+ if (!prim_link->stream) {
+ talloc_free(prim_link);
+ return NULL;
+ }
+ osmo_stream_srv_link_set_data(prim_link->stream, prim_link);
+ osmo_stream_srv_link_set_domain(prim_link->stream, AF_UNIX);
+ osmo_stream_srv_link_set_type(prim_link->stream, SOCK_SEQPACKET);
+ osmo_stream_srv_link_set_accept_cb(prim_link->stream, _osmo_prim_srv_link_accept);
+
+ prim_link->log_cat = DLGLOBAL;
+ prim_link->rx_msgb_alloc_len = 1600 - sizeof(struct osmo_prim_pkt_hdr);
+ return prim_link;
+}
+
+void osmo_prim_srv_link_free(struct osmo_prim_srv_link *prim_link)
+{
+ if (!prim_link)
+ return;
+
+ if (prim_link->stream) {
+ osmo_stream_srv_link_close(prim_link->stream);
+ osmo_stream_srv_link_destroy(prim_link->stream);
+ prim_link->stream = NULL;
+ }
+ talloc_free(prim_link);
+}
+
+void osmo_prim_srv_link_set_name(struct osmo_prim_srv_link *prim_link, const char *name)
+{
+ osmo_stream_srv_link_set_name(prim_link->stream, name);
+}
+
+int osmo_prim_srv_link_set_addr(struct osmo_prim_srv_link *prim_link, const char *path)
+{
+ osmo_talloc_replace_string(prim_link, &prim_link->addr, path);
+ osmo_stream_srv_link_set_addr(prim_link->stream, path);
+ return 0;
+}
+
+const char *osmo_prim_srv_link_get_addr(struct osmo_prim_srv_link *prim_link)
+{
+ return prim_link->addr;
+}
+
+void osmo_prim_srv_link_set_priv(struct osmo_prim_srv_link *prim_link, void *priv)
+{
+ prim_link->priv = priv;
+}
+
+void *osmo_prim_srv_link_get_priv(const struct osmo_prim_srv_link *prim_link)
+{
+ return prim_link->priv;
+}
+
+void osmo_prim_srv_link_set_log_category(struct osmo_prim_srv_link *prim_link, int log_cat)
+{
+ prim_link->log_cat = log_cat;
+}
+
+void osmo_prim_srv_link_set_opened_conn_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_conn_cb opened_conn_cb)
+{
+ prim_link->opened_conn_cb = opened_conn_cb;
+}
+void osmo_prim_srv_link_set_closed_conn_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_conn_cb closed_conn_cb)
+{
+ prim_link->closed_conn_cb = closed_conn_cb;
+}
+
+void osmo_prim_srv_link_set_rx_sapi_version_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_rx_sapi_version rx_sapi_version_cb)
+{
+ prim_link->rx_sapi_version_cb = rx_sapi_version_cb;
+}
+
+void osmo_prim_srv_link_set_rx_cb(struct osmo_prim_srv_link *prim_link, osmo_prim_srv_rx_cb rx_cb)
+{
+ prim_link->rx_cb = rx_cb;
+}
+
+void osmo_prim_srv_link_set_rx_msgb_alloc_len(struct osmo_prim_srv_link *prim_link, size_t alloc_len)
+{
+ prim_link->rx_msgb_alloc_len = alloc_len;
+}
+
+int osmo_prim_srv_link_open(struct osmo_prim_srv_link *prim_link)
+{
+ int rc;
+
+ if (!prim_link->addr) {
+ LOGSRVLINK(prim_link, LOGL_ERROR, "Cannot open, Address not configured\n");
+ return -1;
+ }
+
+ rc = osmo_stream_srv_link_open(prim_link->stream);
+
+ LOGSRVLINK(prim_link, LOGL_INFO, "Started listening on Lower Layer Unix Domain Socket: %s\n", prim_link->addr);
+
+ return rc;
+}
diff --git a/src/rs232.c b/src/rs232.c
index 8ee658a..b20c111 100644
--- a/src/rs232.c
+++ b/src/rs232.c
@@ -62,7 +62,7 @@ void rs232_tx_timer_cb(void *ptr)
struct osmo_rs232 *r = ptr;
/* we're again ready to transmit. */
- r->ofd.when |= OSMO_FD_WRITE;
+ osmo_fd_write_enable(&r->ofd);
}
static int handle_ser_write(struct osmo_fd *bfd)
@@ -72,15 +72,15 @@ static int handle_ser_write(struct osmo_fd *bfd)
struct msgb *msg;
int written;
- LOGP(DLINP, LOGL_DEBUG, "writing data to rs232\n");
+ LOGP(DLINP, LOGL_DEBUG, "writing data to rs232\n");
- if (llist_empty(&r->tx_queue)) {
- r->ofd.when &= ~OSMO_FD_WRITE;
- return 0;
- }
- lh = r->tx_queue.next;
- llist_del(lh);
- msg = llist_entry(lh, struct msgb, list);
+ if (llist_empty(&r->tx_queue)) {
+ osmo_fd_write_disable(&r->ofd);
+ return 0;
+ }
+ lh = r->tx_queue.next;
+ llist_del(lh);
+ msg = llist_entry(lh, struct msgb, list);
written = write(bfd->fd, msg->data, msg->len);
if (written < msg->len) {
@@ -92,7 +92,7 @@ static int handle_ser_write(struct osmo_fd *bfd)
/* We've got more data to write, but we have to wait to make it. */
if (!llist_empty(&r->tx_queue) && r->cfg.delay_us) {
- r->ofd.when &= ~OSMO_FD_WRITE;
+ osmo_fd_write_disable(&r->ofd);
osmo_timer_schedule(&r->tx_timer, 0, r->cfg.delay_us);
}
return 0;
@@ -254,8 +254,8 @@ int osmo_rs232_read(struct osmo_rs232 *r, struct msgb *msg)
void osmo_rs232_write(struct osmo_rs232 *r, struct msgb *msg)
{
- msgb_enqueue(&r->tx_queue, msg);
- r->ofd.when |= OSMO_FD_WRITE;
+ msgb_enqueue(&r->tx_queue, msg);
+ osmo_fd_write_enable(&r->ofd);
}
void osmo_rs232_close(struct osmo_rs232 *r)
diff --git a/src/rtp.c b/src/rtp.c
index 5718c5f..f4b0ada 100644
--- a/src/rtp.c
+++ b/src/rtp.c
@@ -89,13 +89,14 @@ int osmo_rtp_handle_tx_set_timestamp(struct osmo_rtp_handle *h, uint32_t timesta
struct rtp_hdr *osmo_rtp_get_hdr(struct msgb *msg)
{
- struct rtp_hdr *rtph = (struct rtp_hdr *)msg->data;
+ struct rtp_hdr *rtph;
if (msg->len < sizeof(struct rtp_hdr)) {
DEBUGPC(DLMUX, "received RTP frame too short (len = %d)\n",
msg->len);
return NULL;
}
+ rtph = (struct rtp_hdr *)msg->data;
if (rtph->version != RTP_VERSION) {
DEBUGPC(DLMUX, "received RTP version %d not supported.\n",
rtph->version);
@@ -198,7 +199,8 @@ osmo_rtp_build(struct osmo_rtp_handle *h, uint8_t payload_type,
rtph->timestamp = htonl(h->tx.timestamp);
h->tx.timestamp += duration;
rtph->ssrc = htonl(h->tx.ssrc);
- memcpy(msg->data + sizeof(struct rtp_hdr), data, payload_len);
+ if (payload_len > 0)
+ memcpy(msg->data + sizeof(struct rtp_hdr), data, payload_len);
msgb_put(msg, sizeof(struct rtp_hdr) + payload_len);
return msg;
diff --git a/src/sctp.c b/src/sctp.c
new file mode 100644
index 0000000..807bdac
--- /dev/null
+++ b/src/sctp.c
@@ -0,0 +1,95 @@
+#include <netinet/sctp.h>
+#include <osmocom/netif/sctp.h>
+
+const struct value_string osmo_sctp_assoc_chg_strs[] = {
+ { SCTP_COMM_UP, "COMM_UP" },
+ { SCTP_COMM_LOST, "COMM_LOST" },
+ { SCTP_RESTART, "RESTART" },
+ { SCTP_SHUTDOWN_COMP, "SHUTDOWN_COMP" },
+ { SCTP_CANT_STR_ASSOC, "CANT_STR_ASSOC" },
+ { 0, NULL }
+};
+
+const struct value_string osmo_sctp_paddr_chg_strs[] = {
+ { SCTP_ADDR_AVAILABLE, "ADDR_AVAILABLE" },
+ { SCTP_ADDR_UNREACHABLE, "ADDR_UNREACHABLE" },
+ { SCTP_ADDR_REMOVED, "ADDR_REMOVED" },
+ { SCTP_ADDR_ADDED, "ADDR_ADDED" },
+ { SCTP_ADDR_MADE_PRIM, "ADDR_MADE_PRIM" },
+ { SCTP_ADDR_CONFIRMED, "ADDR_CONFIRMED" },
+#ifdef SCTP_ADDR_PF
+ { SCTP_ADDR_PF, "ADDR_POTENTIALLY_FAILED" },
+#endif
+ { 0, NULL }
+};
+
+const struct value_string osmo_sctp_sn_type_strs[] = {
+ { SCTP_ASSOC_CHANGE, "ASSOC_CHANGE" },
+ { SCTP_PEER_ADDR_CHANGE, "PEER_ADDR_CHANGE" },
+ { SCTP_SHUTDOWN_EVENT, "SHUTDOWN_EVENT" },
+ { SCTP_SEND_FAILED, "SEND_FAILED" },
+ { SCTP_REMOTE_ERROR, "REMOTE_ERROR" },
+ { SCTP_PARTIAL_DELIVERY_EVENT, "PARTIAL_DELIVERY_EVENT" },
+ { SCTP_ADAPTATION_INDICATION, "ADAPTATION_INDICATION" },
+#ifdef SCTP_AUTHENTICATION_INDICATION
+ { SCTP_AUTHENTICATION_INDICATION, "AUTHENTICATION_INDICATION" },
+#endif
+#ifdef SCTP_SENDER_DRY_EVENT
+ { SCTP_SENDER_DRY_EVENT, "SENDER_DRY_EVENT" },
+#endif
+ { 0, NULL }
+};
+
+
+const struct value_string osmo_sctp_sn_error_strs[] = {
+ { SCTP_FAILED_THRESHOLD, "FAILED_THRESHOLD" },
+ { SCTP_RECEIVED_SACK, "RECEIVED_SACK" },
+ { SCTP_HEARTBEAT_SUCCESS, "HEARTBEAT_SUCCESS" },
+ { SCTP_RESPONSE_TO_USER_REQ, "RESPONSE_TO_USER_REQ" },
+ { SCTP_INTERNAL_ERROR, "INTERNAL_ERROR" },
+ { SCTP_SHUTDOWN_GUARD_EXPIRES, "SHUTDOWN_GUARD_EXPIRES" },
+ { SCTP_PEER_FAULTY, "PEER_FAULTY" },
+ { 0, NULL }
+};
+
+/* rfc4960 section 3.3.10 "Operation Error", in host byte order */
+const struct value_string osmo_sctp_op_error_strs[] = {
+ { OSMO_SCTP_OP_ERR_INVALID_STREAM_ID, "Invalid Stream Identifier" },
+ { OSMO_SCTP_OP_ERR_MISS_MAND_PARAM, "Missing Mandatory Parameter" },
+ { OSMO_SCTP_OP_ERR_STALE_COOKIE, "Stale Cookie Error" },
+ { OSMO_SCTP_OP_ERR_NO_RESOURCES, "Out of Resource" },
+ { OSMO_SCTP_OP_ERR_UNRESOLV_ADDR, "Unresolvable Address" },
+ { OSMO_SCTP_OP_ERR_UNKN_CHUNK_TYPE, "Unrecognized Chunk Type" },
+ { OSMO_SCTP_OP_ERR_INVALID_MAND_PARAM, "Invalid Mandatory Parameter" },
+ { OSMO_SCTP_OP_ERR_UNKN_PARAM, "Unrecognized Parameters" },
+ { OSMO_SCTP_OP_ERR_NO_USER_DATA, "No User Data" },
+ { OSMO_SCTP_OP_ERR_COOKIE_RX_WHILE_SHUTDOWN, "Cookie Received While Shutting Down" },
+ { OSMO_SCTP_OP_ERR_RESTART_ASSC_NEW_ADDR, "Restart of an Association with New Addresses" },
+ { OSMO_SCTP_OP_ERR_UNER_INITED_ABORT, "User Initiated Abort" },
+ { OSMO_SCTP_OP_ERR_PROTO_VERSION, "Protocol Violation" },
+ { 0, NULL }
+};
+
+/* linux/sctp.h enum sctp_spinfo_state */
+const struct value_string osmo_sctp_spinfo_state_strs[] = {
+ { SCTP_INACTIVE, "INACTIVE" },
+ { SCTP_PF, "POTENTIALLY_FAILED" },
+ { SCTP_ACTIVE, "ACTIVE" },
+ { SCTP_UNCONFIRMED, "UNCONFIRMED" },
+ { SCTP_UNKNOWN, "UNKNOWN" },
+ { 0, NULL }
+};
+
+/* linux/sctp.h enum sctp_sstat_state */
+const struct value_string osmo_sctp_sstat_state_strs[] = {
+ { SCTP_EMPTY, "EMPTY" },
+ { SCTP_CLOSED, "CLOSED" },
+ { SCTP_COOKIE_WAIT, "COOKIE_WAIT" },
+ { SCTP_COOKIE_ECHOED, "COOKIE_ECHOED" },
+ { SCTP_ESTABLISHED, "ESTABLISHED" },
+ { SCTP_SHUTDOWN_PENDING, "SHUTDOWN_PENDING" },
+ { SCTP_SHUTDOWN_SENT, "SHUTDOWN_SENT" },
+ { SCTP_SHUTDOWN_RECEIVED, "SHUTDOWN_RECEIVED" },
+ { SCTP_SHUTDOWN_ACK_SENT, "SHUTDOWN_ACK_SENT" },
+ { 0, NULL }
+};
diff --git a/src/stream.c b/src/stream.c
index 2bb3e75..f8cbed6 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -1,5 +1,6 @@
/* (C) 2011 by Pablo Neira Ayuso <pablo@gnumonks.org>
* (C) 2015-2016 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2023 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
* All Rights Reserved.
*
* SPDX-License-Identifier: GPL-2.0+
@@ -37,42 +38,22 @@
#include <osmocom/core/utils.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/core/msgb.h>
+#include <osmocom/core/osmo_io.h>
+#include <osmocom/core/panic.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/socket.h>
#include <osmocom/netif/stream.h>
+#include <osmocom/netif/stream_private.h>
#include "config.h"
-#ifdef HAVE_LIBSCTP
-#include <netinet/sctp.h>
-#endif
+#include <osmocom/netif/sctp.h>
-#define LOGSCLI(cli, level, fmt, args...) \
- LOGP(DLINP, level, "[%s] %s(): " fmt, get_value_string(stream_cli_state_names, (cli)->state), __func__, ## args)
-
-/*! \addtogroup stream Osmocom Stream Socket
- * @{
- *
- * This code is intended to abstract any use of stream-type sockets,
- * such as TCP and SCTP. It offers both server and client side
- * implementations, fully integrated with the libosmocore select loop
- * abstraction.
- */
-
-/*! \file stream.c
- * \brief Osmocom stream socket helpers
- */
+/*! \cond private */
#ifdef HAVE_LIBSCTP
-/*
- * Platforms that don't have MSG_NOSIGNAL (which disables SIGPIPE)
- * usually have SO_NOSIGPIPE (set via setsockopt).
- */
-#ifndef MSG_NOSIGNAL
-#define MSG_NOSIGNAL 0
-#endif
/* is any of the bytes from offset .. u8_size in 'u8' non-zero? return offset or -1 if all zero */
static int byte_nonzero(const uint8_t *u8, unsigned int offset, unsigned int u8_size)
@@ -87,7 +68,7 @@ static int byte_nonzero(const uint8_t *u8, unsigned int offset, unsigned int u8_
return -1;
}
-static int sctp_sockopt_event_subscribe_size = 0;
+static unsigned int sctp_sockopt_event_subscribe_size = 0;
static int determine_sctp_sockopt_event_subscribe_size(void)
{
@@ -96,7 +77,7 @@ static int determine_sctp_sockopt_event_subscribe_size(void)
int sd, rc;
/* only do this once */
- if (sctp_sockopt_event_subscribe_size != 0)
+ if (sctp_sockopt_event_subscribe_size > 0)
return 0;
sd = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP);
@@ -108,7 +89,7 @@ static int determine_sctp_sockopt_event_subscribe_size(void)
if (rc < 0)
return rc;
- sctp_sockopt_event_subscribe_size = buf_len;
+ sctp_sockopt_event_subscribe_size = (unsigned int)buf_len;
LOGP(DLINP, LOGL_INFO, "sizes of 'struct sctp_event_subscribe': compile-time %zu, kernel: %u\n",
sizeof(struct sctp_event_subscribe), sctp_sockopt_event_subscribe_size);
@@ -167,7 +148,7 @@ static int sctp_setsockopt_events_linux_workaround(int fd, const struct sctp_eve
}
#endif // HAVE_LIBSCTP
-static int sctp_sock_activate_events(int fd)
+int stream_sctp_sock_activate_events(int fd)
{
#ifdef HAVE_LIBSCTP
struct sctp_event_subscribe event;
@@ -193,7 +174,7 @@ static int sctp_sock_activate_events(int fd)
#endif
}
-static int setsockopt_nodelay(int fd, int proto, int on)
+int stream_setsockopt_nodelay(int fd, int proto, int on)
{
int rc;
@@ -215,1160 +196,145 @@ static int setsockopt_nodelay(int fd, int proto, int on)
return rc;
}
-
-/*
- * Client side.
- */
-
-enum osmo_stream_cli_state {
- STREAM_CLI_STATE_CLOSED, /* No fd associated, no timer active */
- STREAM_CLI_STATE_WAIT_RECONNECT, /* No fd associated, has timer active to try to connect again */
- STREAM_CLI_STATE_CONNECTING, /* Fd associated, but connection not yet confirmed by peer or lower layers */
- STREAM_CLI_STATE_CONNECTED, /* Fd associated and connection is established */
- STREAM_CLI_STATE_MAX
-};
-
-static const struct value_string stream_cli_state_names[] = {
- { STREAM_CLI_STATE_CLOSED, "CLOSED" },
- { STREAM_CLI_STATE_WAIT_RECONNECT, "WAIT_RECONNECT" },
- { STREAM_CLI_STATE_CONNECTING, "CONNECTING" },
- { STREAM_CLI_STATE_CONNECTED, "CONNECTED" },
- { 0, NULL }
-};
-
-#define OSMO_STREAM_CLI_F_RECONF (1 << 0)
-#define OSMO_STREAM_CLI_F_NODELAY (1 << 1)
-
-#ifdef HAVE_LIBSCTP
-#define OSMO_STREAM_MAX_ADDRS OSMO_SOCK_MAX_ADDRS
-#else
-#define OSMO_STREAM_MAX_ADDRS 1
-#endif
-
-struct osmo_stream_cli {
- struct osmo_fd ofd;
- struct llist_head tx_queue;
- struct osmo_timer_list timer;
- enum osmo_stream_cli_state state;
- char *addr[OSMO_STREAM_MAX_ADDRS];
- uint8_t addrcnt;
- uint16_t port;
- char *local_addr[OSMO_STREAM_MAX_ADDRS];
- uint8_t local_addrcnt;
- uint16_t local_port;
- uint16_t proto;
- int (*connect_cb)(struct osmo_stream_cli *srv);
- int (*disconnect_cb)(struct osmo_stream_cli *srv);
- int (*read_cb)(struct osmo_stream_cli *srv);
- int (*write_cb)(struct osmo_stream_cli *srv);
- void *data;
- int flags;
- int reconnect_timeout;
-};
-
-void osmo_stream_cli_close(struct osmo_stream_cli *cli);
-
-/*! \brief Re-connect an Osmocom Stream Client
- * If re-connection is enabled for this client
- * (which is the case unless negative timeout was explicitly set via osmo_stream_cli_set_reconnect_timeout() call),
- * we close any existing connection (if any) and schedule a re-connect timer */
-void osmo_stream_cli_reconnect(struct osmo_stream_cli *cli)
-{
- osmo_stream_cli_close(cli);
-
- if (cli->reconnect_timeout < 0) {
- LOGSCLI(cli, LOGL_INFO, "not reconnecting, disabled.\n");
- return;
- }
-
- cli->state = STREAM_CLI_STATE_WAIT_RECONNECT;
- LOGSCLI(cli, LOGL_INFO, "retrying in %d seconds...\n",
- cli->reconnect_timeout);
- osmo_timer_schedule(&cli->timer, cli->reconnect_timeout, 0);
-}
-
-/*! \brief Check if Osmocom Stream Client is in connected state
- * \param[in] cli Osmocom Stream Client
- * \return true if connected, false otherwise
- */
-bool osmo_stream_cli_is_connected(struct osmo_stream_cli *cli)
-{
- return cli->state == STREAM_CLI_STATE_CONNECTED;
-}
-
-/*! \brief Close an Osmocom Stream Client
- * \param[in] cli Osmocom Stream Client to be closed
- * We unregister the socket fd from the osmocom select() loop
- * abstraction and close the socket */
-void osmo_stream_cli_close(struct osmo_stream_cli *cli)
-{
- if (cli->ofd.fd == -1)
- return;
- osmo_fd_unregister(&cli->ofd);
- close(cli->ofd.fd);
- cli->ofd.fd = -1;
-
- if (cli->state == STREAM_CLI_STATE_CONNECTED) {
- LOGSCLI(cli, LOGL_DEBUG, "connection closed\n");
- if (cli->disconnect_cb)
- cli->disconnect_cb(cli);
- }
-
- cli->state = STREAM_CLI_STATE_CLOSED;
-}
-
-static void osmo_stream_cli_read(struct osmo_stream_cli *cli)
-{
- LOGSCLI(cli, LOGL_DEBUG, "message received\n");
-
- if (cli->read_cb)
- cli->read_cb(cli);
-}
-
-static int osmo_stream_cli_write(struct osmo_stream_cli *cli)
-{
-#ifdef HAVE_LIBSCTP
- struct sctp_sndrcvinfo sinfo;
-#endif
- struct msgb *msg;
- struct llist_head *lh;
- int ret;
-
- if (llist_empty(&cli->tx_queue)) {
- cli->ofd.when &= ~OSMO_FD_WRITE;
- return 0;
- }
- lh = cli->tx_queue.next;
- llist_del(lh);
- msg = llist_entry(lh, struct msgb, list);
-
- if (!osmo_stream_cli_is_connected(cli)) {
- LOGSCLI(cli, LOGL_ERROR, "not connected, dropping data!\n");
- return 0;
- }
-
- LOGSCLI(cli, LOGL_DEBUG, "sending %u bytes of data\n", msgb_length(msg));
-
- switch (cli->proto) {
#ifdef HAVE_LIBSCTP
- case IPPROTO_SCTP:
- memset(&sinfo, 0, sizeof(sinfo));
- sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));
- sinfo.sinfo_stream = msgb_sctp_stream(msg);
- ret = sctp_send(cli->ofd.fd, msg->data, msgb_length(msg),
- &sinfo, MSG_NOSIGNAL);
- break;
-#endif
- case IPPROTO_TCP:
- default:
- ret = send(cli->ofd.fd, msg->data, msgb_length(msg), 0);
- break;
- }
- if (ret < 0) {
- if (errno == EPIPE || errno == ENOTCONN) {
- osmo_stream_cli_reconnect(cli);
- }
- LOGSCLI(cli, LOGL_ERROR, "error %d to send\n", ret);
- }
- msgb_free(msg);
- return 0;
-}
-
-static int osmo_stream_cli_fd_cb(struct osmo_fd *ofd, unsigned int what)
-{
- struct osmo_stream_cli *cli = ofd->data;
- int error, ret;
- socklen_t len = sizeof(error);
-
- switch(cli->state) {
- case STREAM_CLI_STATE_CONNECTING:
- ret = getsockopt(ofd->fd, SOL_SOCKET, SO_ERROR, &error, &len);
- if (ret >= 0 && error > 0) {
- osmo_stream_cli_reconnect(cli);
- return 0;
- }
-
- /* If messages got enqueued while 'connecting', keep WRITE flag
- up to dispatch them upon next main loop step */
- if (llist_empty(&cli->tx_queue))
- cli->ofd.when &= ~OSMO_FD_WRITE;
-
- LOGSCLI(cli, LOGL_DEBUG, "connection done.\n");
- cli->state = STREAM_CLI_STATE_CONNECTED;
- if (cli->proto == IPPROTO_SCTP) {
-#ifdef SO_NOSIGPIPE
- int val = 1;
-
- ret = setsockopt(ofd->fd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&val, sizeof(val));
- if (ret < 0)
- LOGSCLI(cli, LOGL_DEBUG, "Failed setting SO_NOSIGPIPE: %s\n", strerror(errno));
-#endif
- sctp_sock_activate_events(ofd->fd);
- }
- if (cli->connect_cb)
- cli->connect_cb(cli);
- break;
- case STREAM_CLI_STATE_CONNECTED:
- if (what & OSMO_FD_READ) {
- LOGSCLI(cli, LOGL_DEBUG, "connected read\n");
- osmo_stream_cli_read(cli);
- }
- if (what & OSMO_FD_WRITE) {
- LOGSCLI(cli, LOGL_DEBUG, "connected write\n");
- osmo_stream_cli_write(cli);
- }
- break;
- default:
- /* Only CONNECTING and CONNECTED states are expected, since they are the only states where FD exists: */
- osmo_panic("osmo_stream_cli_fd_cb called with unexpected state %d\n", cli->state);
- }
- return 0;
-}
-
-static void cli_timer_cb(void *data);
-
-/*! \brief Create an Osmocom stream client
- * \param[in] ctx talloc context from which to allocate memory
- * This function allocates a new \ref osmo_stream_cli and initializes
- * it with default values (5s reconnect timer, TCP protocol)
- * \return allocated stream client, or NULL in case of error
- */
-struct osmo_stream_cli *osmo_stream_cli_create(void *ctx)
-{
- struct osmo_stream_cli *cli;
-
- cli = talloc_zero(ctx, struct osmo_stream_cli);
- if (!cli)
- return NULL;
-
- cli->proto = IPPROTO_TCP;
- cli->ofd.fd = -1;
- cli->ofd.priv_nr = 0; /* XXX */
- cli->ofd.cb = osmo_stream_cli_fd_cb;
- cli->ofd.data = cli;
- cli->state = STREAM_CLI_STATE_CLOSED;
- osmo_timer_setup(&cli->timer, cli_timer_cb, cli);
- cli->reconnect_timeout = 5; /* default is 5 seconds. */
- INIT_LLIST_HEAD(&cli->tx_queue);
-
- return cli;
-}
-
-/*! \brief Set the remote address to which we connect
- * \param[in] cli Stream Client to modify
- * \param[in] addr Remote IP address
- */
-void
-osmo_stream_cli_set_addr(struct osmo_stream_cli *cli, const char *addr)
-{
- osmo_stream_cli_set_addrs(cli, &addr, 1);
-}
-
-/*! \brief Set the remote address set to which we connect.
- * Useful for protocols allowing connecting to more than one address (such as SCTP)
- * \param[in] cli Stream Client to modify
- * \param[in] addr Remote IP address set
- * \return negative on error, 0 on success
- */
-int osmo_stream_cli_set_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)
-{
- int i = 0;
-
- if (addrcnt > OSMO_STREAM_MAX_ADDRS)
- return -EINVAL;
-
- for (; i < addrcnt; i++)
- osmo_talloc_replace_string(cli, &cli->addr[i], addr[i]);
- for (; i < cli->addrcnt; i++) {
- talloc_free(cli->addr[i]);
- cli->addr[i] = NULL;
- }
-
- cli->addrcnt = addrcnt;
- cli->flags |= OSMO_STREAM_CLI_F_RECONF;
- return 0;
-}
-
-/*! \brief Set the remote port number to which we connect
- * \param[in] cli Stream Client to modify
- * \param[in] port Remote port number
- */
-void
-osmo_stream_cli_set_port(struct osmo_stream_cli *cli, uint16_t port)
-{
- cli->port = port;
- cli->flags |= OSMO_STREAM_CLI_F_RECONF;
-}
-
-/*! \brief Set the local port number for the socket (to be bound to)
- * \param[in] cli Stream Client to modify
- * \param[in] port Local port number
- */
-void
-osmo_stream_cli_set_local_port(struct osmo_stream_cli *cli, uint16_t port)
-{
- cli->local_port = port;
- cli->flags |= OSMO_STREAM_CLI_F_RECONF;
-}
-
-/*! \brief Set the local address for the socket (to be bound to)
- * \param[in] cli Stream Client to modify
- * \param[in] port Local host name
- */
-void
-osmo_stream_cli_set_local_addr(struct osmo_stream_cli *cli, const char *addr)
-{
- osmo_stream_cli_set_local_addrs(cli, &addr, 1);
-}
-
-/*! \brief Set the local address set to which we connect.
- * Useful for protocols allowing bind to more than one address (such as SCTP)
- * \param[in] cli Stream Client to modify
- * \param[in] addr Local IP address set
- * \return negative on error, 0 on success
- */
-int osmo_stream_cli_set_local_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)
-{
- int i = 0;
-
- if (addrcnt > OSMO_STREAM_MAX_ADDRS)
- return -EINVAL;
-
- for (; i < addrcnt; i++)
- osmo_talloc_replace_string(cli, &cli->local_addr[i], addr[i]);
- for (; i < cli->local_addrcnt; i++) {
- talloc_free(cli->local_addr[i]);
- cli->local_addr[i] = NULL;
- }
-
- cli->local_addrcnt = addrcnt;
- cli->flags |= OSMO_STREAM_CLI_F_RECONF;
- return 0;
-}
-
-/*! \brief Set the protocol for the stream client socket
- * \param[in] cli Stream Client to modify
- * \param[in] proto Protocol (like IPPROTO_TCP (default), IPPROTO_SCTP, ...)
- */
-void
-osmo_stream_cli_set_proto(struct osmo_stream_cli *cli, uint16_t proto)
-{
- cli->proto = proto;
- cli->flags |= OSMO_STREAM_CLI_F_RECONF;
-}
-
-/*! \brief Set the reconnect time of the stream client socket
- * \param[in] cli Stream Client to modify
- * \param[in] timeout Re-connect timeout in seconds or negative value to disable auto-reconnection */
-void
-osmo_stream_cli_set_reconnect_timeout(struct osmo_stream_cli *cli, int timeout)
-{
- cli->reconnect_timeout = timeout;
-}
-
-/*! \brief Set application private data of the stream client socket
- * \param[in] cli Stream Client to modify
- * \param[in] data User-specific data (available in call-back functions) */
-void
-osmo_stream_cli_set_data(struct osmo_stream_cli *cli, void *data)
-{
- cli->data = data;
-}
-
-/*! \brief Get application private data of the stream client socket
- * \param[in] cli Stream Client to modify
- * \returns Application private data, as set by \ref osmo_stream_cli_set_data() */
-void *osmo_stream_cli_get_data(struct osmo_stream_cli *cli)
-{
- return cli->data;
-}
-
-/*! \brief Get the stream client socket description.
- * \param[in] cli Stream Client to examine
- * \returns Socket description or NULL in case of error */
-char *osmo_stream_cli_get_sockname(const struct osmo_stream_cli *cli)
-{
- static char buf[OSMO_SOCK_NAME_MAXLEN];
-
- osmo_sock_get_name_buf(buf, OSMO_SOCK_NAME_MAXLEN, cli->ofd.fd);
-
- return buf;
-}
-
-/*! \brief Get Osmocom File Descriptor of the stream client socket
- * \param[in] cli Stream Client to modify
- * \returns Pointer to \ref osmo_fd */
-struct osmo_fd *
-osmo_stream_cli_get_ofd(struct osmo_stream_cli *cli)
-{
- return &cli->ofd;
-}
-
-/*! \brief Set the call-back function called on connect of the stream client socket
- * \param[in] cli Stream Client to modify
- * \param[in] connect_cb Call-back function to be called upon connect */
-void
-osmo_stream_cli_set_connect_cb(struct osmo_stream_cli *cli,
- int (*connect_cb)(struct osmo_stream_cli *cli))
-{
- cli->connect_cb = connect_cb;
-}
-
-/*! \brief Set the call-back function called on disconnect of the stream client socket
- * \param[in] cli Stream Client to modify
- * \param[in] disconnect_cb Call-back function to be called upon disconnect */
-void osmo_stream_cli_set_disconnect_cb(struct osmo_stream_cli *cli,
- int (*disconnect_cb)(struct osmo_stream_cli *cli))
-{
- cli->disconnect_cb = disconnect_cb;
-}
-
-/*! \brief Set the call-back function called to read from the stream client socket
- * \param[in] cli Stream Client to modify
- * \param[in] read_cb Call-back function to be called when we want to read */
-void
-osmo_stream_cli_set_read_cb(struct osmo_stream_cli *cli,
- int (*read_cb)(struct osmo_stream_cli *cli))
-{
- cli->read_cb = read_cb;
-}
-
-/*! \brief Destroy a Osmocom stream client (includes close)
- * \param[in] cli Stream Client to destroy */
-void osmo_stream_cli_destroy(struct osmo_stream_cli *cli)
-{
- osmo_stream_cli_close(cli);
- osmo_timer_del(&cli->timer);
- msgb_queue_free(&cli->tx_queue);
- talloc_free(cli);
-}
-
-/*! \brief DEPRECATED: use osmo_stream_cli_set_reconnect_timeout() or osmo_stream_cli_reconnect() instead!
- * Open connection of an Osmocom stream client
- * \param[in] cli Stream Client to connect
- * \param[in] reconect 1 if we should not automatically reconnect
- * \return negative on error, 0 on success
- */
-int osmo_stream_cli_open2(struct osmo_stream_cli *cli, int reconnect)
-{
- int ret;
-
- /* we are reconfiguring this socket, close existing first. */
- if ((cli->flags & OSMO_STREAM_CLI_F_RECONF) && cli->ofd.fd >= 0)
- osmo_stream_cli_close(cli);
-
- cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;
-
- switch (cli->proto) {
-#ifdef HAVE_LIBSCTP
- case IPPROTO_SCTP:
- ret = osmo_sock_init2_multiaddr(AF_UNSPEC, SOCK_STREAM, cli->proto,
- (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,
- (const char **)cli->addr, cli->addrcnt, cli->port,
- OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
- break;
-#endif
- default:
- ret = osmo_sock_init2(AF_UNSPEC, SOCK_STREAM, cli->proto,
- cli->local_addr[0], cli->local_port,
- cli->addr[0], cli->port,
- OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
- }
-
- if (ret < 0) {
- if (reconnect)
- osmo_stream_cli_reconnect(cli);
- return ret;
- }
- osmo_fd_setup(&cli->ofd, ret, OSMO_FD_READ | OSMO_FD_WRITE, cli->ofd.cb, cli->ofd.data, cli->ofd.priv_nr);
-
- if (cli->flags & OSMO_STREAM_CLI_F_NODELAY) {
- ret = setsockopt_nodelay(cli->ofd.fd, cli->proto, 1);
- if (ret < 0)
- goto error_close_socket;
- }
-
- if (osmo_fd_register(&cli->ofd) < 0)
- goto error_close_socket;
-
- cli->state = STREAM_CLI_STATE_CONNECTING;
- return 0;
-
-error_close_socket:
- close(cli->ofd.fd);
- cli->ofd.fd = -1;
- return -EIO;
-}
-
-/*! \brief Set the NODELAY socket option to avoid Nagle-like behavior
- * Setting this to nodelay=true will automatically set the NODELAY
- * socket option on any socket established via \ref osmo_stream_cli_open
- * or any re-connect. You have to set this _before_ opening the
- * socket.
- * \param[in] cli Stream client whose sockets are to be configured
- * \param[in] nodelay whether to set (true) NODELAY before connect()
- */
-void osmo_stream_cli_set_nodelay(struct osmo_stream_cli *cli, bool nodelay)
-{
- if (nodelay)
- cli->flags |= OSMO_STREAM_CLI_F_NODELAY;
- else
- cli->flags &= ~OSMO_STREAM_CLI_F_NODELAY;
-}
-
-/*! \brief Open connection of an Osmocom stream client
- * By default the client will automatically reconnect after default timeout.
- * To disable this, use osmo_stream_cli_set_reconnect_timeout() before calling this function.
- * \param[in] cli Stream Client to connect
- * \return negative on error, 0 on success */
-int osmo_stream_cli_open(struct osmo_stream_cli *cli)
-{
- int ret;
-
- /* we are reconfiguring this socket, close existing first. */
- if ((cli->flags & OSMO_STREAM_CLI_F_RECONF) && cli->ofd.fd >= 0)
- osmo_stream_cli_close(cli);
-
- cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;
-
-
- switch (cli->proto) {
-#ifdef HAVE_LIBSCTP
- case IPPROTO_SCTP:
- ret = osmo_sock_init2_multiaddr(AF_UNSPEC, SOCK_STREAM, cli->proto,
- (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,
- (const char **)cli->addr, cli->addrcnt, cli->port,
- OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
- break;
-#endif
- default:
- ret = osmo_sock_init2(AF_UNSPEC, SOCK_STREAM, cli->proto,
- cli->local_addr[0], cli->local_port,
- cli->addr[0], cli->port,
- OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
- }
-
- if (ret < 0) {
- osmo_stream_cli_reconnect(cli);
- return ret;
- }
- osmo_fd_setup(&cli->ofd, ret, OSMO_FD_READ | OSMO_FD_WRITE, cli->ofd.cb, cli->ofd.data, cli->ofd.priv_nr);
-
- if (cli->flags & OSMO_STREAM_CLI_F_NODELAY) {
- ret = setsockopt_nodelay(cli->ofd.fd, cli->proto, 1);
- if (ret < 0)
- goto error_close_socket;
- }
-
- if (osmo_fd_register(&cli->ofd) < 0)
- goto error_close_socket;
-
- cli->state = STREAM_CLI_STATE_CONNECTING;
- return 0;
-
-error_close_socket:
- cli->state = STREAM_CLI_STATE_CLOSED;
- close(cli->ofd.fd);
- cli->ofd.fd = -1;
- return -EIO;
-}
-
-static void cli_timer_cb(void *data)
-{
- struct osmo_stream_cli *cli = data;
-
- LOGSCLI(cli, LOGL_DEBUG, "reconnecting.\n");
- osmo_stream_cli_open(cli);
-}
-
-/*! \brief Enqueue data to be sent via an Osmocom stream client
- * \param[in] cli Stream Client through which we want to send
- * \param[in] msg Message buffer to enqueue in transmit queue */
-void osmo_stream_cli_send(struct osmo_stream_cli *cli, struct msgb *msg)
-{
- msgb_enqueue(&cli->tx_queue, msg);
- cli->ofd.when |= OSMO_FD_WRITE;
-}
-
-/*! \brief Receive data via an Osmocom stream client
- * \param[in] cli Stream Client through which we want to send
- * \param msg pre-allocate message buffer to which received data is appended
- * \returns number of bytes read; <=0 in case of error */
-int osmo_stream_cli_recv(struct osmo_stream_cli *cli, struct msgb *msg)
-{
- int ret;
-
- ret = recv(cli->ofd.fd, msg->data, msg->data_len, 0);
- if (ret < 0) {
- if (errno == EPIPE || errno == ECONNRESET) {
- LOGSCLI(cli, LOGL_ERROR, "lost connection with srv\n");
+static int stream_sctp_recvmsg_trailer(const char *log_pfx, struct msgb *msg, int ret, const struct sctp_sndrcvinfo *sinfo, int flags)
+{
+ msgb_sctp_msg_flags(msg) = 0;
+ if (OSMO_LIKELY(sinfo)) {
+ msgb_sctp_ppid(msg) = ntohl(sinfo->sinfo_ppid);
+ msgb_sctp_stream(msg) = sinfo->sinfo_stream;
+ }
+
+ if (flags & MSG_NOTIFICATION) {
+ char buf[512];
+ struct osmo_strbuf sb = { .buf = buf, .len = sizeof(buf) };
+ int logl = LOGL_INFO;
+ union sctp_notification *notif = (union sctp_notification *) msg->data;
+
+ OSMO_STRBUF_PRINTF(sb, "%s NOTIFICATION %s flags=0x%x", log_pfx,
+ osmo_sctp_sn_type_str(notif->sn_header.sn_type), notif->sn_header.sn_flags);
+ msgb_put(msg, sizeof(union sctp_notification));
+ msgb_sctp_msg_flags(msg) = OSMO_STREAM_SCTP_MSG_FLAGS_NOTIFICATION;
+ ret = -EAGAIN;
+
+ switch (notif->sn_header.sn_type) {
+ case SCTP_ASSOC_CHANGE:
+ OSMO_STRBUF_PRINTF(sb, " %s", osmo_sctp_assoc_chg_str(notif->sn_assoc_change.sac_state));
+ switch (notif->sn_assoc_change.sac_state) {
+ case SCTP_COMM_UP:
+ break;
+ case SCTP_COMM_LOST:
+ OSMO_STRBUF_PRINTF(sb, " (err: %s)",
+ osmo_sctp_sn_error_str(notif->sn_assoc_change.sac_error));
+ /* Handle this like a regular disconnect */
+ ret = 0;
+ break;
+ case SCTP_RESTART:
+ case SCTP_SHUTDOWN_COMP:
+ logl = LOGL_NOTICE;
+ break;
+ case SCTP_CANT_STR_ASSOC:
+ break;
+ }
+ break;
+ case SCTP_SEND_FAILED:
+ logl = LOGL_ERROR;
+ break;
+ case SCTP_PEER_ADDR_CHANGE:
+ {
+ char addr_str[INET6_ADDRSTRLEN + 10];
+ struct sockaddr_storage sa = notif->sn_paddr_change.spc_aaddr;
+ osmo_sockaddr_to_str_buf(addr_str, sizeof(addr_str),
+ (const struct osmo_sockaddr *)&sa);
+ OSMO_STRBUF_PRINTF(sb, " %s %s err=%s",
+ osmo_sctp_paddr_chg_str(notif->sn_paddr_change.spc_state), addr_str,
+ (notif->sn_paddr_change.spc_state == SCTP_ADDR_UNREACHABLE) ?
+ osmo_sctp_sn_error_str(notif->sn_paddr_change.spc_error) : "None");
+ }
+ break;
+ case SCTP_SHUTDOWN_EVENT:
+ logl = LOGL_NOTICE;
+ /* RFC6458 3.1.4: Any attempt to send more data will cause sendmsg()
+ * to return with an ESHUTDOWN error. */
+ break;
+ case SCTP_REMOTE_ERROR:
+ logl = LOGL_NOTICE;
+ OSMO_STRBUF_PRINTF(sb, " %s", osmo_sctp_op_error_str(ntohs(notif->sn_remote_error.sre_error)));
+ break;
}
- osmo_stream_cli_reconnect(cli);
- return ret;
- } else if (ret == 0) {
- LOGSCLI(cli, LOGL_ERROR, "connection closed with srv\n");
- osmo_stream_cli_reconnect(cli);
+ LOGP(DLINP, logl, "%s\n", buf);
return ret;
}
- msgb_put(msg, ret);
- LOGSCLI(cli, LOGL_DEBUG, "received %d bytes from srv\n", ret);
- return ret;
-}
-
-/*
- * Server side.
- */
-#define OSMO_STREAM_SRV_F_RECONF (1 << 0)
-#define OSMO_STREAM_SRV_F_NODELAY (1 << 1)
+ if (OSMO_UNLIKELY(ret > 0 && !sinfo))
+ LOGP(DLINP, LOGL_ERROR, "%s sctp_recvmsg without SNDRCV cmsg?!?\n", log_pfx);
-struct osmo_stream_srv_link {
- struct osmo_fd ofd;
- char *addr[OSMO_STREAM_MAX_ADDRS];
- uint8_t addrcnt;
- uint16_t port;
- uint16_t proto;
- int (*accept_cb)(struct osmo_stream_srv_link *srv, int fd);
- void *data;
- int flags;
-};
-
-static int osmo_stream_srv_fd_cb(struct osmo_fd *ofd, unsigned int what)
-{
- int ret;
- int sock_fd;
- char addrstr[128];
- bool is_ipv6;
- struct sockaddr_storage sa;
- socklen_t sa_len = sizeof(sa);
- struct osmo_stream_srv_link *link = ofd->data;
-
- ret = accept(ofd->fd, (struct sockaddr *)&sa, &sa_len);
- if (ret < 0) {
- LOGP(DLINP, LOGL_ERROR, "failed to accept from origin "
- "peer, reason=`%s'\n", strerror(errno));
- return ret;
- }
- is_ipv6 = ((struct sockaddr *)&sa)->sa_family == AF_INET6;
- LOGP(DLINP, LOGL_DEBUG, "accept()ed new link from %s to port %u\n",
- inet_ntop(is_ipv6 ? AF_INET6 : AF_INET,
- is_ipv6 ? (void*)&(((struct sockaddr_in6 *)&sa)->sin6_addr) :
- (void*)&(((struct sockaddr_in *)&sa)->sin_addr),
- addrstr, sizeof(addrstr)),
- link->port);
- sock_fd = ret;
-
- if (link->proto == IPPROTO_SCTP) {
- ret = sctp_sock_activate_events(sock_fd);
- if (ret < 0)
- goto error_close_socket;
- }
-
- if (link->flags & OSMO_STREAM_SRV_F_NODELAY) {
- ret = setsockopt_nodelay(sock_fd, link->proto, 1);
- if (ret < 0)
- goto error_close_socket;
- }
-
- if (!link->accept_cb) {
- ret = -ENOTSUP;
- goto error_close_socket;
- }
-
- ret = link->accept_cb(link, sock_fd);
- if (ret)
- goto error_close_socket;
- return 0;
-
-error_close_socket:
- close(sock_fd);
return ret;
}
-/*! \brief Create an Osmocom Stream Server Link
- * A Stream Server Link is the listen()+accept() "parent" to individual
- * Stream Servers
- * \param[in] ctx talloc allocation context
- * \returns Stream Server Link with default values (TCP)
- */
-struct osmo_stream_srv_link *osmo_stream_srv_link_create(void *ctx)
-{
- struct osmo_stream_srv_link *link;
-
- link = talloc_zero(ctx, struct osmo_stream_srv_link);
- if (!link)
- return NULL;
-
- link->proto = IPPROTO_TCP;
- osmo_fd_setup(&link->ofd, -1, OSMO_FD_READ | OSMO_FD_WRITE, osmo_stream_srv_fd_cb, link, 0);
-
- return link;
-}
-
-/*! \brief Set the NODELAY socket option to avoid Nagle-like behavior
- * Setting this to nodelay=true will automatically set the NODELAY
- * socket option on any socket established via this server link, before
- * calling the accept_cb()
- * \param[in] link server link whose sockets are to be configured
- * \param[in] nodelay whether to set (true) NODELAY after accept
- */
-void osmo_stream_srv_link_set_nodelay(struct osmo_stream_srv_link *link, bool nodelay)
-{
- if (nodelay)
- link->flags |= OSMO_STREAM_SRV_F_NODELAY;
- else
- link->flags &= ~OSMO_STREAM_SRV_F_NODELAY;
-}
-
-/*! \brief Set the local address to which we bind
- * \param[in] link Stream Server Link to modify
- * \param[in] addr Local IP address
- */
-void osmo_stream_srv_link_set_addr(struct osmo_stream_srv_link *link,
- const char *addr)
-{
- osmo_stream_srv_link_set_addrs(link, &addr, 1);
-}
-
-/*! \brief Set the local address set to which we bind.
- * Useful for protocols allowing bind on more than one address (such as SCTP)
- * \param[in] link Stream Server Link to modify
- * \param[in] addr Local IP address
- * \return negative on error, 0 on success
- */
-int osmo_stream_srv_link_set_addrs(struct osmo_stream_srv_link *link, const char **addr, size_t addrcnt)
-{
- int i = 0;
-
- if (addrcnt > OSMO_STREAM_MAX_ADDRS)
- return -EINVAL;
-
- for (; i < addrcnt; i++)
- osmo_talloc_replace_string(link, &link->addr[i], addr[i]);
- for (; i < link->addrcnt; i++) {
- talloc_free(link->addr[i]);
- link->addr[i] = NULL;
- }
-
- link->addrcnt = addrcnt;
- link->flags |= OSMO_STREAM_SRV_F_RECONF;
- return 0;
-}
-
-/*! \brief Set the local port number to which we bind
- * \param[in] link Stream Server Link to modify
- * \param[in] port Local port number
- */
-void osmo_stream_srv_link_set_port(struct osmo_stream_srv_link *link,
- uint16_t port)
+/*! wrapper for regular synchronous sctp_recvmsg(3) */
+int stream_sctp_recvmsg_wrapper(int fd, struct msgb *msg, const char *log_pfx)
{
- link->port = port;
- link->flags |= OSMO_STREAM_SRV_F_RECONF;
-}
-
-/*! \brief Set the protocol for the stream server link
- * \param[in] link Stream Server Link to modify
- * \param[in] proto Protocol (like IPPROTO_TCP (default), IPPROTO_SCTP, ...)
- */
-void
-osmo_stream_srv_link_set_proto(struct osmo_stream_srv_link *link,
- uint16_t proto)
-{
- link->proto = proto;
- link->flags |= OSMO_STREAM_SRV_F_RECONF;
-}
-
-/*! \brief Set application private data of the stream server link
- * \param[in] link Stream Server Link to modify
- * \param[in] data User-specific data (available in call-back functions) */
-void
-osmo_stream_srv_link_set_data(struct osmo_stream_srv_link *link,
- void *data)
-{
- link->data = data;
-}
-
-/*! \brief Get application private data of the stream server link
- * \param[in] link Stream Server Link to modify
- * \returns Application private data, as set by \ref osmo_stream_cli_set_data() */
-void *osmo_stream_srv_link_get_data(struct osmo_stream_srv_link *link)
-{
- return link->data;
-}
-
-/*! \brief Get description of the stream server link e. g. 127.0.0.1:1234
- * \param[in] link Stream Server Link to examine
- * \returns Link description or NULL in case of error */
-char *osmo_stream_srv_link_get_sockname(const struct osmo_stream_srv_link *link)
-{
- static char buf[INET6_ADDRSTRLEN + 6];
- int rc = osmo_sock_get_local_ip(link->ofd.fd, buf, INET6_ADDRSTRLEN);
- if (rc < 0)
- return NULL;
-
- buf[strnlen(buf, INET6_ADDRSTRLEN + 6)] = ':';
-
- rc = osmo_sock_get_local_ip_port(link->ofd.fd, buf + strnlen(buf, INET6_ADDRSTRLEN + 6), 6);
- if (rc < 0)
- return NULL;
-
- return buf;
-}
-
-/*! \brief Get Osmocom File Descriptor of the stream server link
- * \param[in] link Stream Server Link
- * \returns Pointer to \ref osmo_fd */
-struct osmo_fd *
-osmo_stream_srv_link_get_ofd(struct osmo_stream_srv_link *link)
-{
- return &link->ofd;
-}
-
-/*! \brief Set the accept() call-back of the stream server link
- * \param[in] link Stream Server Link
- * \param[in] accept_cb Call-back function executed upon accept() */
-void osmo_stream_srv_link_set_accept_cb(struct osmo_stream_srv_link *link,
- int (*accept_cb)(struct osmo_stream_srv_link *link, int fd))
-
-{
- link->accept_cb = accept_cb;
-}
-
-/*! \brief Destroy the stream server link. Closes + Releases Memory.
- * \param[in] link Stream Server Link */
-void osmo_stream_srv_link_destroy(struct osmo_stream_srv_link *link)
-{
- osmo_stream_srv_link_close(link);
- talloc_free(link);
-}
-
-/*! \brief Open the stream server link. This actually initializes the
- * underlying socket and binds it to the configured ip/port
- * \param[in] link Stream Server Link to open
- * \return negative on error, 0 on success */
-int osmo_stream_srv_link_open(struct osmo_stream_srv_link *link)
-{
- int ret;
-
- if (link->ofd.fd >= 0) {
- /* No reconfigure needed for existing socket, we are fine */
- if (!(link->flags & OSMO_STREAM_SRV_F_RECONF))
- return 0;
- /* we are reconfiguring this socket, close existing first. */
- osmo_stream_srv_link_close(link);
- }
-
- link->flags &= ~OSMO_STREAM_SRV_F_RECONF;
-
- switch (link->proto) {
-#ifdef HAVE_LIBSCTP
- case IPPROTO_SCTP:
- ret = osmo_sock_init2_multiaddr(AF_UNSPEC, SOCK_STREAM, link->proto,
- (const char **)link->addr, link->addrcnt, link->port,
- NULL, 0, 0, OSMO_SOCK_F_BIND);
- break;
-#endif
- default:
- ret = osmo_sock_init(AF_UNSPEC, SOCK_STREAM, link->proto,
- link->addr[0], link->port, OSMO_SOCK_F_BIND);
- }
- if (ret < 0)
- return ret;
-
- link->ofd.fd = ret;
- if (osmo_fd_register(&link->ofd) < 0) {
- close(ret);
- link->ofd.fd = -1;
- return -EIO;
- }
- return 0;
-}
-
-/*! \brief Close the stream server link and unregister from select loop
- * Does not destroy the server link, merely closes it!
- * \param[in] link Stream Server Link to close */
-void osmo_stream_srv_link_close(struct osmo_stream_srv_link *link)
-{
- if (link->ofd.fd == -1)
- return;
- osmo_fd_unregister(&link->ofd);
- close(link->ofd.fd);
- link->ofd.fd = -1;
-}
-
-#define OSMO_STREAM_SRV_F_FLUSH_DESTROY (1 << 0)
-
-struct osmo_stream_srv {
- struct osmo_stream_srv_link *srv;
- struct osmo_fd ofd;
- struct llist_head tx_queue;
- int (*closed_cb)(struct osmo_stream_srv *peer);
- int (*cb)(struct osmo_stream_srv *peer);
- void *data;
- int flags;
-};
-
-static int osmo_stream_srv_read(struct osmo_stream_srv *conn)
-{
- int rc = 0;
-
- LOGP(DLINP, LOGL_DEBUG, "message received\n");
-
- if (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY) {
- LOGP(DLINP, LOGL_DEBUG, "Connection is being flushed and closed; ignoring received message\n");
- return 0;
- }
-
- if (conn->cb)
- rc = conn->cb(conn);
-
- return rc;
-}
-
-static void osmo_stream_srv_write(struct osmo_stream_srv *conn)
-{
-#ifdef HAVE_LIBSCTP
struct sctp_sndrcvinfo sinfo;
-#endif
- struct msgb *msg;
- struct llist_head *lh;
+ int flags = 0;
int ret;
- LOGP(DLINP, LOGL_DEBUG, "sending data\n");
-
- if (llist_empty(&conn->tx_queue)) {
- conn->ofd.when &= ~OSMO_FD_WRITE;
- return;
- }
- lh = conn->tx_queue.next;
- llist_del(lh);
- msg = llist_entry(lh, struct msgb, list);
-
- switch (conn->srv->proto) {
-#ifdef HAVE_LIBSCTP
- case IPPROTO_SCTP:
- memset(&sinfo, 0, sizeof(sinfo));
- sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));
- sinfo.sinfo_stream = msgb_sctp_stream(msg);
- ret = sctp_send(conn->ofd.fd, msg->data, msgb_length(msg),
- &sinfo, MSG_NOSIGNAL);
- break;
-#endif
- case IPPROTO_TCP:
- default:
- ret = send(conn->ofd.fd, msg->data, msg->len, 0);
- break;
- }
- if (ret < 0) {
- LOGP(DLINP, LOGL_ERROR, "error to send\n");
- }
- msgb_free(msg);
-
- if (llist_empty(&conn->tx_queue) && (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY))
- osmo_stream_srv_destroy(conn);
-}
-
-static int osmo_stream_srv_cb(struct osmo_fd *ofd, unsigned int what)
-{
- struct osmo_stream_srv *conn = ofd->data;
- int rc = 0;
-
- LOGP(DLINP, LOGL_DEBUG, "connected read/write\n");
- if (what & OSMO_FD_READ)
- rc = osmo_stream_srv_read(conn);
- if (rc != -EBADF && (what & OSMO_FD_WRITE))
- osmo_stream_srv_write(conn);
-
- return rc;
+ ret = sctp_recvmsg(fd, msg->tail, msgb_tailroom(msg), NULL, NULL, &sinfo, &flags);
+ return stream_sctp_recvmsg_trailer(log_pfx, msg, ret, &sinfo, flags);
}
-/*! \brief Create a Stream Server inside the specified link
- * \param[in] ctx talloc allocation context from which to allocate
- * \param[in] link Stream Server Link to which we belong
- * \returns Stream Server in case of success; NULL on error */
-struct osmo_stream_srv *
-osmo_stream_srv_create(void *ctx, struct osmo_stream_srv_link *link,
- int fd,
- int (*cb)(struct osmo_stream_srv *conn),
- int (*closed_cb)(struct osmo_stream_srv *conn), void *data)
+/*! wrapper for osmo_io asynchronous recvmsg response */
+int stream_iofd_sctp_recvmsg_trailer(struct osmo_io_fd *iofd, struct msgb *msg, int ret, const struct msghdr *msgh)
{
- struct osmo_stream_srv *conn;
+ const struct sctp_sndrcvinfo *sinfo = NULL;
+ struct cmsghdr *cmsg = NULL;
- conn = talloc_zero(ctx, struct osmo_stream_srv);
- if (conn == NULL) {
- LOGP(DLINP, LOGL_ERROR, "cannot allocate new peer in srv, "
- "reason=`%s'\n", strerror(errno));
- return NULL;
- }
- conn->srv = link;
- osmo_fd_setup(&conn->ofd, fd, OSMO_FD_READ, osmo_stream_srv_cb, conn, 0);
- conn->cb = cb;
- conn->closed_cb = closed_cb;
- conn->data = data;
- INIT_LLIST_HEAD(&conn->tx_queue);
-
- if (osmo_fd_register(&conn->ofd) < 0) {
- LOGP(DLINP, LOGL_ERROR, "could not register FD\n");
- talloc_free(conn);
- return NULL;
+ for (cmsg = CMSG_FIRSTHDR((struct msghdr *) msgh); cmsg != NULL;
+ cmsg = CMSG_NXTHDR((struct msghdr *) msgh, cmsg)) {
+ if (cmsg->cmsg_level == IPPROTO_SCTP && cmsg->cmsg_type == SCTP_SNDRCV) {
+ sinfo = (const struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
+ break;
+ }
}
- return conn;
-}
-/*! \brief Prepare to send out all pending messages on the connection's Tx queue
- * and then automatically destroy the stream with osmo_stream_srv_destroy().
- * This function disables queuing of new messages on the connection and also
- * disables reception of new messages on the connection.
- * \param[in] conn Stream Server to modify */
-void osmo_stream_srv_set_flush_and_destroy(struct osmo_stream_srv *conn)
-{
- conn->flags |= OSMO_STREAM_SRV_F_FLUSH_DESTROY;
+ return stream_sctp_recvmsg_trailer(osmo_iofd_get_name(iofd), msg, ret, sinfo, msgh->msg_flags);
}
-/*! \brief Set application private data of the stream server
- * \param[in] conn Stream Server to modify
- * \param[in] data User-specific data (available in call-back functions) */
-void
-osmo_stream_srv_set_data(struct osmo_stream_srv *conn,
- void *data)
+/*! Send a message through a connected SCTP socket, similar to sctp_sendmsg().
+ *
+ * Appends the message to the internal transmit queue.
+ * If the function returns success (0), it will take ownership of the msgb and
+ * internally call msgb_free() after the write request completes.
+ * In case of an error the msgb needs to be freed by the caller.
+ *
+ * \param[in] iofd file descriptor to write to
+ * \param[in] msg message buffer to send; uses msgb_sctp_ppid/msg_sctp_stream
+ * \param[in] sendmsg_flags Flags to pass to the send call
+ * \returns 0 in case of success; a negative value in case of error
+ */
+int stream_iofd_sctp_send_msgb(struct osmo_io_fd *iofd, struct msgb *msg, int sendmsg_flags)
{
- conn->data = data;
-}
+ struct msghdr outmsg = {};
+ char outcmsg[CMSG_SPACE(sizeof(struct sctp_sndrcvinfo))];
+ struct sctp_sndrcvinfo *sinfo;
+ struct cmsghdr *cmsg;
-/*! \brief Get application private data of the stream server
- * \param[in] conn Stream Server
- * \returns Application private data, as set by \ref osmo_stream_srv_set_data() */
-void *osmo_stream_srv_get_data(struct osmo_stream_srv *conn)
-{
- return conn->data;
-}
+ outmsg.msg_control = outcmsg;
+ outmsg.msg_controllen = sizeof(outcmsg);
-/*! \brief Get Osmocom File Descriptor of the stream server
- * \param[in] conn Stream Server
- * \returns Pointer to \ref osmo_fd */
-struct osmo_fd *
-osmo_stream_srv_get_ofd(struct osmo_stream_srv *conn)
-{
- return &conn->ofd;
-}
+ cmsg = CMSG_FIRSTHDR(&outmsg);
+ cmsg->cmsg_level = IPPROTO_SCTP;
+ cmsg->cmsg_type = SCTP_SNDRCV;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct sctp_sndrcvinfo));
-/*! \brief Get the master (Link) from a Stream Server
- * \param[in] conn Stream Server of which we want to know the Link
- * \returns Link through which the given Stream Server is established */
-struct osmo_stream_srv_link *osmo_stream_srv_get_master(struct osmo_stream_srv *conn)
-{
- return conn->srv;
-}
-
-/*! \brief Destroy given Stream Server
- * This function closes the Stream Server socket, unregisters from
- * select loop, invokes the connection's closed_cb() callback to allow API
- * users to clean up any associated state they have for this connection,
- * and then de-allocates associated memory.
- * \param[in] conn Stream Server to be destroyed */
-void osmo_stream_srv_destroy(struct osmo_stream_srv *conn)
-{
- close(conn->ofd.fd);
- osmo_fd_unregister(&conn->ofd);
- if (conn->closed_cb)
- conn->closed_cb(conn);
- msgb_queue_free(&conn->tx_queue);
- talloc_free(conn);
-}
-
-/*! \brief Enqueue data to be sent via an Osmocom stream server
- * \param[in] conn Stream Server through which we want to send
- * \param[in] msg Message buffer to enqueue in transmit queue */
-void osmo_stream_srv_send(struct osmo_stream_srv *conn, struct msgb *msg)
-{
- if (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY) {
- LOGP(DLINP, LOGL_DEBUG, "Connection is being flushed and closed; ignoring new outgoing message\n");
- return;
- }
+ outmsg.msg_controllen = cmsg->cmsg_len;
+ sinfo = (struct sctp_sndrcvinfo *)CMSG_DATA(cmsg);
+ memset(sinfo, 0, sizeof(struct sctp_sndrcvinfo));
+ sinfo->sinfo_ppid = htonl(msgb_sctp_ppid(msg));
+ sinfo->sinfo_stream = msgb_sctp_stream(msg);
- msgb_enqueue(&conn->tx_queue, msg);
- conn->ofd.when |= OSMO_FD_WRITE;
+ return osmo_iofd_sendmsg_msgb(iofd, msg, sendmsg_flags, &outmsg);
}
-
-/*! \brief Receive data via Osmocom stream server
- * \param[in] conn Stream Server from which to receive
- * \param msg pre-allocate message buffer to which received data is appended
- * \returns number of bytes read, negative on error.
- */
-int osmo_stream_srv_recv(struct osmo_stream_srv *conn, struct msgb *msg)
-{
-#ifdef HAVE_LIBSCTP
- struct sctp_sndrcvinfo sinfo;
- int flags = 0;
#endif
- int ret;
-
- if (!msg)
- return -EINVAL;
-
- switch (conn->srv->proto) {
-#ifdef HAVE_LIBSCTP
- case IPPROTO_SCTP:
- ret = sctp_recvmsg(conn->ofd.fd, msgb_data(msg), msgb_tailroom(msg),
- NULL, NULL, &sinfo, &flags);
- if (flags & MSG_NOTIFICATION) {
- union sctp_notification *notif = (union sctp_notification *) msgb_data(msg);
- LOGP(DLINP, LOGL_DEBUG, "NOTIFICATION %u flags=0x%x\n", notif->sn_header.sn_type, notif->sn_header.sn_flags);
- switch (notif->sn_header.sn_type) {
- case SCTP_ASSOC_CHANGE:
- LOGP(DLINP, LOGL_DEBUG, "===> ASSOC CHANGE:");
- switch (notif->sn_assoc_change.sac_state) {
- case SCTP_COMM_UP:
- LOGPC(DLINP, LOGL_DEBUG, " UP\n");
- break;
- case SCTP_COMM_LOST:
- LOGPC(DLINP, LOGL_DEBUG, " LOST\n");
- break;
- case SCTP_RESTART:
- LOGPC(DLINP, LOGL_DEBUG, " RESTART\n");
- break;
- case SCTP_SHUTDOWN_COMP:
- LOGPC(DLINP, LOGL_DEBUG, " SHUTDOWN COMP\n");
- break;
- case SCTP_CANT_STR_ASSOC:
- LOGPC(DLINP, LOGL_DEBUG, " CANT STR ASSOC\n");
- break;
- }
- break;
- case SCTP_PEER_ADDR_CHANGE:
- LOGP(DLINP, LOGL_DEBUG, "===> PEER ADDR CHANGE\n");
- break;
- case SCTP_SHUTDOWN_EVENT:
- LOGP(DLINP, LOGL_DEBUG, "===> SHUTDOWN EVT\n");
- /* Handle this like a regular disconnect */
- return 0;
- break;
- }
- return -EAGAIN;
- }
- msgb_sctp_ppid(msg) = ntohl(sinfo.sinfo_ppid);
- msgb_sctp_stream(msg) = sinfo.sinfo_stream;
- break;
-#endif
- case IPPROTO_TCP:
- default:
- ret = recv(conn->ofd.fd, msgb_data(msg), msgb_tailroom(msg), 0);
- break;
- }
-
- if (ret < 0) {
- if (errno == EPIPE || errno == ECONNRESET) {
- LOGP(DLINP, LOGL_ERROR,
- "lost connection with srv\n");
- }
- return ret;
- } else if (ret == 0) {
- LOGP(DLINP, LOGL_ERROR, "connection closed with srv\n");
- return ret;
- }
- msgb_put(msg, ret);
- LOGP(DLINP, LOGL_DEBUG, "received %d bytes from client\n", ret);
- return ret;
-}
-/*! @} */
+/*! \endccond */
diff --git a/src/stream_cli.c b/src/stream_cli.c
new file mode 100644
index 0000000..d4067d6
--- /dev/null
+++ b/src/stream_cli.c
@@ -0,0 +1,1237 @@
+/* (C) 2011 by Pablo Neira Ayuso <pablo@gnumonks.org>
+ * (C) 2015-2016 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2023 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * All Rights Reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+#include <sys/fcntl.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/osmo_io.h>
+#include <osmocom/core/panic.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/socket.h>
+
+#include <osmocom/netif/stream.h>
+#include <osmocom/netif/stream_private.h>
+
+#include "config.h"
+
+#include <osmocom/netif/sctp.h>
+
+/*! \file stream_cli.c */
+
+#define LOGSCLI(cli, level, fmt, args...) \
+ LOGP(DLINP, level, "CLICONN(%s,%s){%s} " fmt, \
+ cli->name ? : "", \
+ cli->sockname, \
+ get_value_string(stream_cli_state_names, (cli)->state), \
+ ## args)
+
+/*
+ * Client side.
+ */
+
+enum osmo_stream_cli_state {
+ STREAM_CLI_STATE_CLOSED, /* No fd associated, no timer active */
+ STREAM_CLI_STATE_WAIT_RECONNECT, /* No fd associated, has timer active to try to connect again */
+ STREAM_CLI_STATE_CONNECTING, /* Fd associated, but connection not yet confirmed by peer or lower layers */
+ STREAM_CLI_STATE_CONNECTED, /* Fd associated and connection is established */
+ STREAM_CLI_STATE_MAX
+};
+
+static const struct value_string stream_cli_state_names[] = {
+ { STREAM_CLI_STATE_CLOSED, "CLOSED" },
+ { STREAM_CLI_STATE_WAIT_RECONNECT, "WAIT_RECONNECT" },
+ { STREAM_CLI_STATE_CONNECTING, "CONNECTING" },
+ { STREAM_CLI_STATE_CONNECTED, "CONNECTED" },
+ { 0, NULL }
+};
+
+#define OSMO_STREAM_CLI_F_RECONF (1 << 0)
+#define OSMO_STREAM_CLI_F_NODELAY (1 << 1)
+
+struct osmo_stream_cli {
+ char *name;
+ char sockname[OSMO_SOCK_NAME_MAXLEN];
+ enum osmo_stream_mode mode;
+ union {
+ struct osmo_fd ofd;
+ struct osmo_io_fd *iofd;
+ };
+ struct llist_head tx_queue;
+ struct osmo_timer_list timer;
+ enum osmo_stream_cli_state state;
+ char *addr[OSMO_STREAM_MAX_ADDRS];
+ uint8_t addrcnt;
+ uint16_t port;
+ char *local_addr[OSMO_STREAM_MAX_ADDRS];
+ uint8_t local_addrcnt;
+ uint16_t local_port;
+ int sk_domain;
+ int sk_type;
+ uint16_t proto;
+ osmo_stream_cli_connect_cb_t connect_cb;
+ osmo_stream_cli_disconnect_cb_t disconnect_cb;
+ osmo_stream_cli_read_cb_t read_cb;
+ osmo_stream_cli_read_cb2_t iofd_read_cb;
+ osmo_stream_cli_segmentation_cb_t segmentation_cb;
+ void *data;
+ int flags;
+ int reconnect_timeout;
+ struct osmo_sock_init2_multiaddr_pars ma_pars;
+};
+
+void osmo_stream_cli_close(struct osmo_stream_cli *cli);
+
+/*! \addtogroup stream_cli
+ * @{
+ */
+
+/*! Re-connect an Osmocom Stream Client.
+ * If re-connection is enabled for this client
+ * (which is the case unless negative timeout was explicitly set via osmo_stream_cli_set_reconnect_timeout() call),
+ * we close any existing connection (if any) and schedule a re-connect timer */
+void osmo_stream_cli_reconnect(struct osmo_stream_cli *cli)
+{
+ osmo_stream_cli_close(cli);
+
+ if (cli->reconnect_timeout < 0) {
+ LOGSCLI(cli, LOGL_INFO, "not reconnecting, disabled\n");
+ return;
+ }
+
+ cli->state = STREAM_CLI_STATE_WAIT_RECONNECT;
+ LOGSCLI(cli, LOGL_INFO, "retrying reconnect in %d seconds...\n",
+ cli->reconnect_timeout);
+ osmo_timer_schedule(&cli->timer, cli->reconnect_timeout, 0);
+}
+
+/*! Check if Osmocom Stream Client is in connected state.
+ * \param[in] cli Osmocom Stream Client
+ * \return true if connected, false otherwise
+ */
+bool osmo_stream_cli_is_connected(struct osmo_stream_cli *cli)
+{
+ return cli->state == STREAM_CLI_STATE_CONNECTED;
+}
+
+static void osmo_stream_cli_close_iofd(struct osmo_stream_cli *cli)
+{
+ if (!cli->iofd)
+ return;
+
+ osmo_iofd_free(cli->iofd);
+ cli->iofd = NULL;
+}
+
+static void osmo_stream_cli_close_ofd(struct osmo_stream_cli *cli)
+{
+ if (cli->ofd.fd == -1)
+ return;
+ osmo_fd_unregister(&cli->ofd);
+ close(cli->ofd.fd);
+ cli->ofd.fd = -1;
+}
+
+/*! Close an Osmocom Stream Client.
+ * \param[in] cli Osmocom Stream Client to be closed
+ * We unregister the socket fd from the osmocom select() loop
+ * abstraction and close the socket */
+void osmo_stream_cli_close(struct osmo_stream_cli *cli)
+{
+ int old_state = cli->state;
+
+ if (cli->state == STREAM_CLI_STATE_CLOSED)
+ return;
+ if (cli->state == STREAM_CLI_STATE_WAIT_RECONNECT) {
+ osmo_timer_del(&cli->timer);
+ cli->state = STREAM_CLI_STATE_CLOSED;
+ return;
+ }
+
+
+ switch (cli->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ osmo_stream_cli_close_ofd(cli);
+ break;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ osmo_stream_cli_close_iofd(cli);
+ break;
+ default:
+ OSMO_ASSERT(false);
+ }
+
+ cli->state = STREAM_CLI_STATE_CLOSED;
+
+ if (old_state == STREAM_CLI_STATE_CONNECTED) {
+ LOGSCLI(cli, LOGL_DEBUG, "connection closed\n");
+ if (cli->disconnect_cb)
+ cli->disconnect_cb(cli);
+ }
+}
+
+/*! Retrieve file descriptor of the stream client socket.
+ * \param[in] cli Stream Client of which we want to obtain the file descriptor
+ * \returns File descriptor or negative in case of error */
+int
+osmo_stream_cli_get_fd(const struct osmo_stream_cli *cli)
+{
+ switch (cli->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ return cli->ofd.fd;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ if (cli->iofd)
+ return osmo_iofd_get_fd(cli->iofd);
+ default:
+ break;
+ }
+ return -EINVAL;
+}
+
+/*! Retrieve osmo_io descriptor of the stream client socket.
+ * This function must not be called on a stream client in legacy osmo_fd mode!
+ * The iofd is only valid once/after osmo_stream_cli_open() has successfully returned.
+ * \param[in] cli Stream Client of which we want to obtain the file descriptor
+ * \returns osmo_io_fd of stream client, or NULL if stream not yet opened. */
+struct osmo_io_fd *
+osmo_stream_cli_get_iofd(const struct osmo_stream_cli *cli)
+{
+ OSMO_ASSERT(cli->mode == OSMO_STREAM_MODE_OSMO_IO);
+ return cli->iofd;
+}
+
+static void osmo_stream_cli_read(struct osmo_stream_cli *cli)
+{
+ LOGSCLI(cli, LOGL_DEBUG, "message received\n");
+
+ if (cli->read_cb)
+ cli->read_cb(cli);
+}
+
+static int osmo_stream_cli_write(struct osmo_stream_cli *cli)
+{
+#ifdef HAVE_LIBSCTP
+ struct sctp_sndrcvinfo sinfo;
+#endif
+ struct msgb *msg;
+ int ret;
+
+ if (llist_empty(&cli->tx_queue)) {
+ osmo_fd_write_disable(&cli->ofd);
+ return 0;
+ }
+ msg = llist_first_entry(&cli->tx_queue, struct msgb, list);
+ llist_del(&msg->list);
+
+ if (!osmo_stream_cli_is_connected(cli)) {
+ LOGSCLI(cli, LOGL_ERROR, "send: not connected, dropping data!\n");
+ return 0;
+ }
+
+ LOGSCLI(cli, LOGL_DEBUG, "sending %u bytes of data\n", msgb_length(msg));
+
+ switch (cli->sk_domain) {
+ case AF_UNIX:
+ ret = send(cli->ofd.fd, msgb_data(msg), msgb_length(msg), 0);
+ break;
+ case AF_UNSPEC:
+ case AF_INET:
+ case AF_INET6:
+ switch (cli->proto) {
+#ifdef HAVE_LIBSCTP
+ case IPPROTO_SCTP:
+ memset(&sinfo, 0, sizeof(sinfo));
+ sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));
+ sinfo.sinfo_stream = msgb_sctp_stream(msg);
+ ret = sctp_send(cli->ofd.fd, msgb_data(msg), msgb_length(msg),
+ &sinfo, MSG_NOSIGNAL);
+ break;
+#endif
+ case IPPROTO_TCP:
+ default:
+ ret = send(cli->ofd.fd, msgb_data(msg), msgb_length(msg), 0);
+ break;
+ }
+ break;
+ default:
+ ret = -ENOTSUP;
+ }
+
+ if (ret >= 0 && ret < msgb_length(msg)) {
+ LOGSCLI(cli, LOGL_ERROR, "short send: %d < exp %u\n", ret, msgb_length(msg));
+ /* Update msgb and re-add it at the start of the queue: */
+ msgb_pull(msg, ret);
+ llist_add(&msg->list, &cli->tx_queue);
+ return 0;
+ }
+
+ if (ret < 0) {
+ int err = errno;
+ LOGSCLI(cli, LOGL_ERROR, "send(len=%u) error: %s\n", msgb_length(msg), strerror(err));
+ if (err == EAGAIN) {
+ /* Re-add at the start of the queue to re-attempt: */
+ llist_add(&msg->list, &cli->tx_queue);
+ return 0;
+ }
+ msgb_free(msg);
+ osmo_stream_cli_reconnect(cli);
+ return 0;
+ }
+
+ msgb_free(msg);
+
+ if (llist_empty(&cli->tx_queue))
+ osmo_fd_write_disable(&cli->ofd);
+
+ return 0;
+}
+
+static int _setsockopt_nosigpipe(struct osmo_stream_cli *cli)
+{
+#ifdef SO_NOSIGPIPE
+ int ret;
+ int val = 1;
+ ret = setsockopt(osmo_stream_cli_get_fd(cli), SOL_SOCKET, SO_NOSIGPIPE, (void *)&val, sizeof(val));
+ if (ret < 0)
+ LOGSCLI(cli, LOGL_ERROR, "Failed setting SO_NOSIGPIPE: %s\n", strerror(errno));
+ return ret;
+#else
+ return 0;
+#endif
+}
+
+static void stream_cli_handle_connecting(struct osmo_stream_cli *cli, int res)
+{
+ int error, ret = res;
+ socklen_t len = sizeof(error);
+
+ int fd = osmo_stream_cli_get_fd(cli);
+ OSMO_ASSERT(fd >= 0);
+
+ if (ret < 0) {
+ osmo_stream_cli_reconnect(cli);
+ return;
+ }
+ ret = getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len);
+ if (ret >= 0 && error > 0) {
+ osmo_stream_cli_reconnect(cli);
+ return;
+ }
+
+ /* If messages got enqueued while 'connecting', keep WRITE flag
+ up to dispatch them upon next main loop step */
+ if (cli->mode == OSMO_STREAM_MODE_OSMO_FD && llist_empty(&cli->tx_queue))
+ osmo_fd_write_disable(&cli->ofd);
+
+ /* Update sockname based on socket info: */
+ osmo_sock_get_name_buf(cli->sockname, sizeof(cli->sockname), osmo_stream_cli_get_fd(cli));
+
+ LOGSCLI(cli, LOGL_INFO, "connection established\n");
+ cli->state = STREAM_CLI_STATE_CONNECTED;
+ switch (cli->sk_domain) {
+ case AF_UNIX:
+ _setsockopt_nosigpipe(cli);
+ break;
+ case AF_UNSPEC:
+ case AF_INET:
+ case AF_INET6:
+ if (cli->proto == IPPROTO_SCTP) {
+ _setsockopt_nosigpipe(cli);
+ stream_sctp_sock_activate_events(fd);
+ }
+ break;
+ default:
+ break;
+ }
+ if (cli->connect_cb)
+ cli->connect_cb(cli);
+}
+
+static int osmo_stream_cli_fd_cb(struct osmo_fd *ofd, unsigned int what)
+{
+ struct osmo_stream_cli *cli = ofd->data;
+
+ switch (cli->state) {
+ case STREAM_CLI_STATE_CONNECTING:
+ stream_cli_handle_connecting(cli, 0);
+ break;
+ case STREAM_CLI_STATE_CONNECTED:
+ if (what & OSMO_FD_READ) {
+ LOGSCLI(cli, LOGL_DEBUG, "connected read\n");
+ osmo_stream_cli_read(cli);
+ }
+ if (what & OSMO_FD_WRITE) {
+ LOGSCLI(cli, LOGL_DEBUG, "connected write\n");
+ osmo_stream_cli_write(cli);
+ }
+ break;
+ default:
+ /* Only CONNECTING and CONNECTED states are expected, since they are the only states
+ * where FD exists: */
+ osmo_panic("%s() called with unexpected state %d\n", __func__, cli->state);
+ }
+ return 0;
+}
+
+static void cli_timer_cb(void *data);
+
+/*! Create an Osmocom stream client.
+ * \param[in] ctx talloc context from which to allocate memory
+ * This function allocates a new \ref osmo_stream_cli and initializes
+ * it with default values (5s reconnect timer, TCP protocol)
+ * \return allocated stream client, or NULL in case of error
+ */
+struct osmo_stream_cli *osmo_stream_cli_create(void *ctx)
+{
+ struct osmo_stream_cli *cli;
+
+ cli = talloc_zero(ctx, struct osmo_stream_cli);
+ if (!cli)
+ return NULL;
+
+ cli->mode = OSMO_STREAM_MODE_UNKNOWN;
+ cli->sk_domain = AF_UNSPEC;
+ cli->sk_type = SOCK_STREAM;
+ cli->proto = IPPROTO_TCP;
+
+ cli->state = STREAM_CLI_STATE_CLOSED;
+ osmo_timer_setup(&cli->timer, cli_timer_cb, cli);
+ cli->reconnect_timeout = 5; /* default is 5 seconds. */
+ cli->segmentation_cb = NULL;
+ INIT_LLIST_HEAD(&cli->tx_queue);
+
+ cli->ma_pars.sctp.version = 0;
+
+ return cli;
+}
+
+static void stream_cli_iofd_read_cb(struct osmo_io_fd *iofd, int res, struct msgb *msg)
+{
+ struct osmo_stream_cli *cli = osmo_iofd_get_data(iofd);
+
+ switch (cli->state) {
+ case STREAM_CLI_STATE_CONNECTING:
+ msgb_free(msg);
+ stream_cli_handle_connecting(cli, res);
+ break;
+ case STREAM_CLI_STATE_CONNECTED:
+ switch (res) {
+ case -EPIPE:
+ case -ECONNRESET:
+ LOGSCLI(cli, LOGL_ERROR, "lost connection with srv (%d)\n", res);
+ osmo_stream_cli_reconnect(cli);
+ break;
+ case 0:
+ LOGSCLI(cli, LOGL_NOTICE, "connection closed with srv\n");
+ osmo_stream_cli_reconnect(cli);
+ break;
+ default:
+ LOGSCLI(cli, LOGL_DEBUG, "received %d bytes from srv\n", res);
+ break;
+ }
+ /* Notify user of new data or error: */
+ if (cli->iofd_read_cb)
+ cli->iofd_read_cb(cli, res, msg);
+ else
+ msgb_free(msg);
+ break;
+ default:
+ osmo_panic("%s() called with unexpected state %d\n", __func__, cli->state);
+ }
+}
+
+static void stream_cli_iofd_write_cb(struct osmo_io_fd *iofd, int res, struct msgb *msg)
+{
+ struct osmo_stream_cli *cli = osmo_iofd_get_data(iofd);
+
+ switch (cli->state) {
+ case STREAM_CLI_STATE_CONNECTING:
+ stream_cli_handle_connecting(cli, res);
+ break;
+ case STREAM_CLI_STATE_CONNECTED:
+ if (msg && res <= 0) {
+ osmo_stream_cli_reconnect(cli);
+ LOGSCLI(cli, LOGL_ERROR, "received error %d in response to send\n", res);
+ }
+ break;
+ default:
+ osmo_panic("%s() called with unexpected state %d\n", __func__, cli->state);
+ }
+}
+
+static const struct osmo_io_ops osmo_stream_cli_ioops = {
+ .read_cb = stream_cli_iofd_read_cb,
+ .write_cb = stream_cli_iofd_write_cb,
+
+ .segmentation_cb = NULL,
+};
+
+#ifdef HAVE_LIBSCTP
+static void stream_cli_iofd_recvmsg_cb(struct osmo_io_fd *iofd, int res, struct msgb *msg, const struct msghdr *msgh)
+{
+ struct osmo_stream_cli *cli = osmo_iofd_get_data(iofd);
+
+ res = stream_iofd_sctp_recvmsg_trailer(iofd, msg, res, msgh);
+
+ switch (cli->state) {
+ case STREAM_CLI_STATE_CONNECTING:
+ msgb_free(msg);
+ stream_cli_handle_connecting(cli, res);
+ break;
+ case STREAM_CLI_STATE_CONNECTED:
+ switch (res) {
+ case -EPIPE:
+ case -ECONNRESET:
+ LOGSCLI(cli, LOGL_ERROR, "lost connection with srv (%d)\n", res);
+ osmo_stream_cli_reconnect(cli);
+ break;
+ case 0:
+ LOGSCLI(cli, LOGL_NOTICE, "connection closed with srv\n");
+ osmo_stream_cli_reconnect(cli);
+ break;
+ default:
+ break;
+ }
+ /* Notify user of new data or error: */
+ if (cli->iofd_read_cb)
+ cli->iofd_read_cb(cli, res, msg);
+ else
+ msgb_free(msg);
+ break;
+ default:
+ osmo_panic("%s() called with unexpected state %d\n", __func__, cli->state);
+ }
+}
+
+static const struct osmo_io_ops osmo_stream_cli_ioops_sctp = {
+ .recvmsg_cb = stream_cli_iofd_recvmsg_cb,
+ .sendmsg_cb = stream_cli_iofd_write_cb,
+
+ .segmentation_cb = NULL,
+};
+#endif
+
+
+/*! Set a name on the cli object (used during logging).
+ * \param[in] cli stream_cli whose name is to be set
+ * \param[in] name the name to be set on cli
+ */
+void osmo_stream_cli_set_name(struct osmo_stream_cli *cli, const char *name)
+{
+ osmo_talloc_replace_string(cli, &cli->name, name);
+ if (cli->mode == OSMO_STREAM_MODE_OSMO_IO && cli->iofd)
+ osmo_iofd_set_name(cli->iofd, name);
+}
+
+/*! Retrieve name previously set on the cli object (see osmo_stream_cli_set_name()).
+ * \param[in] cli stream_cli whose name is to be retrieved
+ * \returns The name to be set on cli; NULL if never set
+ */
+const char *osmo_stream_cli_get_name(const struct osmo_stream_cli *cli)
+{
+ return cli->name;
+}
+
+/*! Set the remote address to which we connect.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] addr Remote IP address
+ */
+void
+osmo_stream_cli_set_addr(struct osmo_stream_cli *cli, const char *addr)
+{
+ osmo_stream_cli_set_addrs(cli, &addr, 1);
+}
+
+/*! Set the remote address set to which we connect.
+ * Useful for protocols allowing connecting to more than one address (such as SCTP)
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] addr Remote IP address set
+ * \return negative on error, 0 on success
+ */
+int osmo_stream_cli_set_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)
+{
+ int i = 0;
+
+ if (addrcnt > OSMO_STREAM_MAX_ADDRS)
+ return -EINVAL;
+
+ for (; i < addrcnt; i++)
+ osmo_talloc_replace_string(cli, &cli->addr[i], addr[i]);
+ for (; i < cli->addrcnt; i++) {
+ talloc_free(cli->addr[i]);
+ cli->addr[i] = NULL;
+ }
+
+ cli->addrcnt = addrcnt;
+ cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+ return 0;
+}
+
+/*! Set the remote port number to which we connect.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] port Remote port number
+ */
+void
+osmo_stream_cli_set_port(struct osmo_stream_cli *cli, uint16_t port)
+{
+ cli->port = port;
+ cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+}
+
+/*! Set the local port number for the socket (to be bound to).
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] port Local port number
+ */
+void
+osmo_stream_cli_set_local_port(struct osmo_stream_cli *cli, uint16_t port)
+{
+ cli->local_port = port;
+ cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+}
+
+/*! Set the local address for the socket (to be bound to).
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] port Local host name
+ */
+void
+osmo_stream_cli_set_local_addr(struct osmo_stream_cli *cli, const char *addr)
+{
+ osmo_stream_cli_set_local_addrs(cli, &addr, 1);
+}
+
+/*! Set the local address set to which we bind.
+ * Useful for protocols allowing bind to more than one address (such as SCTP)
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] addr Local IP address set
+ * \return negative on error, 0 on success
+ */
+int osmo_stream_cli_set_local_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)
+{
+ int i = 0;
+
+ if (addrcnt > OSMO_STREAM_MAX_ADDRS)
+ return -EINVAL;
+
+ for (; i < addrcnt; i++)
+ osmo_talloc_replace_string(cli, &cli->local_addr[i], addr[i]);
+ for (; i < cli->local_addrcnt; i++) {
+ talloc_free(cli->local_addr[i]);
+ cli->local_addr[i] = NULL;
+ }
+
+ cli->local_addrcnt = addrcnt;
+ cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+ return 0;
+}
+
+/*! Set the protocol for the stream client socket.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] proto Protocol (like IPPROTO_TCP (default), IPPROTO_SCTP, ...)
+ */
+void
+osmo_stream_cli_set_proto(struct osmo_stream_cli *cli, uint16_t proto)
+{
+ cli->proto = proto;
+ cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+}
+
+/* Configure client side segmentation for the iofd */
+static void configure_cli_segmentation_cb(struct osmo_stream_cli *cli,
+ osmo_stream_cli_segmentation_cb_t segmentation_cb)
+{
+ /* Copy default settings */
+ struct osmo_io_ops client_ops;
+ osmo_iofd_get_ioops(cli->iofd, &client_ops);
+ /* Set segmentation cb for this client */
+ client_ops.segmentation_cb = segmentation_cb;
+ osmo_iofd_set_ioops(cli->iofd, &client_ops);
+}
+
+/*! Set the segmentation callback for the client.
+ * \param[in,out] cli Stream Client to modify
+ * \param[in] segmentation_cb Target segmentation callback
+ */
+void osmo_stream_cli_set_segmentation_cb(struct osmo_stream_cli *cli,
+ osmo_stream_cli_segmentation_cb_t segmentation_cb)
+{
+ cli->segmentation_cb = segmentation_cb;
+ if (cli->iofd) /* Otherwise, this will be done in osmo_stream_cli_open() */
+ configure_cli_segmentation_cb(cli, segmentation_cb);
+}
+
+/*! Set the socket type for the stream server link.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] type Socket Type (like SOCK_STREAM (default), SOCK_SEQPACKET, ...)
+ * \returns zero on success, negative -errno on error.
+ */
+int osmo_stream_cli_set_type(struct osmo_stream_cli *cli, int type)
+{
+ switch (type) {
+ case SOCK_STREAM:
+ case SOCK_SEQPACKET:
+ break;
+ default:
+ return -ENOTSUP;
+ }
+ cli->sk_type = type;
+ cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+ return 0;
+}
+
+/*! Set the socket type for the stream server link.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] cli Stream Client to modify
+ * \param[in] type Socket Domain (like AF_UNSPEC (default for IP), AF_UNIX, AF_INET, ...)
+ * \returns zero on success, negative -errno on error.
+ */
+int osmo_stream_cli_set_domain(struct osmo_stream_cli *cli, int domain)
+{
+ switch (domain) {
+ case AF_UNSPEC:
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNIX:
+ break;
+ default:
+ return -ENOTSUP;
+ }
+ cli->sk_domain = domain;
+ cli->flags |= OSMO_STREAM_CLI_F_RECONF;
+ return 0;
+}
+
+/*! Set the reconnect time of the stream client socket.
+ * \param[in] cli Stream Client to modify
+ * \param[in] timeout Re-connect timeout in seconds or negative value to disable auto-reconnection */
+void
+osmo_stream_cli_set_reconnect_timeout(struct osmo_stream_cli *cli, int timeout)
+{
+ cli->reconnect_timeout = timeout;
+}
+
+/*! Set application private data of the stream client socket.
+ * \param[in] cli Stream Client to modify
+ * \param[in] data User-specific data (available in call-back functions) */
+void
+osmo_stream_cli_set_data(struct osmo_stream_cli *cli, void *data)
+{
+ cli->data = data;
+}
+
+/*! Retrieve application private data of the stream client socket.
+ * \param[in] cli Stream Client to modify
+ * \returns Application private data, as set by \ref osmo_stream_cli_set_data() */
+void *osmo_stream_cli_get_data(struct osmo_stream_cli *cli)
+{
+ return cli->data;
+}
+
+/*! Retrieve the stream client socket description.
+ * Calling this function will build a string that describes the socket in terms of its local/remote
+ * address/port. The returned name is stored in a static buffer; it is hence not re-entrant or thread-safe.
+ * \param[in] cli Stream Client to examine
+ * \returns Socket description or NULL in case of error */
+char *osmo_stream_cli_get_sockname(const struct osmo_stream_cli *cli)
+{
+ static char buf[OSMO_STREAM_MAX_ADDRS * OSMO_SOCK_NAME_MAXLEN];
+
+ osmo_sock_multiaddr_get_name_buf(buf, sizeof(buf),
+ osmo_stream_cli_get_fd(cli), cli->proto);
+
+ return buf;
+}
+
+/*! Retrieve Osmocom File Descriptor of the stream client socket.
+ * This function only works in case you operate osmo_stream_cli in osmo_fd mode!
+ * \param[in] cli Stream Client to modify
+ * \returns Pointer to \ref osmo_fd */
+struct osmo_fd *
+osmo_stream_cli_get_ofd(struct osmo_stream_cli *cli)
+{
+ OSMO_ASSERT(cli->mode == OSMO_STREAM_MODE_OSMO_FD);
+ return &cli->ofd;
+}
+
+/*! Set the call-back function called on connect of the stream client socket.
+ * The call-back function registered via this function will be called upon completion of the non-blocking
+ * outbound connect operation.
+ * \param[in] cli Stream Client to modify
+ * \param[in] connect_cb Call-back function to be called upon connect */
+void
+osmo_stream_cli_set_connect_cb(struct osmo_stream_cli *cli,
+ osmo_stream_cli_connect_cb_t connect_cb)
+{
+ cli->connect_cb = connect_cb;
+}
+
+/*! Set the call-back function called on disconnect of the stream client socket.
+ * \param[in] cli Stream Client to modify
+ * \param[in] disconnect_cb Call-back function to be called upon disconnect */
+void osmo_stream_cli_set_disconnect_cb(struct osmo_stream_cli *cli,
+ osmo_stream_cli_disconnect_cb_t disconnect_cb)
+{
+ cli->disconnect_cb = disconnect_cb;
+}
+
+/*! Set the call-back function called to read from the stream client socket.
+ * This function will implicitly configure osmo_stream_cli to use legacy osmo_ofd mode.
+ * \param[in] cli Stream Client to modify
+ * \param[in] read_cb Call-back function to be called when we want to read */
+void
+osmo_stream_cli_set_read_cb(struct osmo_stream_cli *cli,
+ osmo_stream_cli_read_cb_t read_cb)
+{
+ OSMO_ASSERT(cli->mode != OSMO_STREAM_MODE_OSMO_IO);
+ cli->mode = OSMO_STREAM_MODE_OSMO_FD;
+ cli->read_cb = read_cb;
+}
+
+/*! Set the call-back function called to read from the stream client socket.
+ * This function will implicitly configure osmo_stream_cli to use osmo_iofd mode.
+ * \param[in] cli Stream Client to modify
+ * \param[in] read_cb Call-back function to be called when data was read from the socket */
+void
+osmo_stream_cli_set_read_cb2(struct osmo_stream_cli *cli,
+ osmo_stream_cli_read_cb2_t read_cb)
+{
+ OSMO_ASSERT(cli->mode != OSMO_STREAM_MODE_OSMO_FD);
+ cli->mode = OSMO_STREAM_MODE_OSMO_IO;
+ cli->iofd_read_cb = read_cb;
+}
+
+/*! Destroy a Osmocom stream client (includes close).
+ * \param[in] cli Stream Client to destroy */
+void osmo_stream_cli_destroy(struct osmo_stream_cli *cli)
+{
+ osmo_stream_cli_close(cli);
+ osmo_timer_del(&cli->timer);
+ msgb_queue_free(&cli->tx_queue);
+ talloc_free(cli);
+}
+
+/*! DEPRECATED: use osmo_stream_cli_set_reconnect_timeout() or osmo_stream_cli_reconnect() instead!
+ * Open connection of an Osmocom stream client
+ * \param[in] cli Stream Client to connect
+ * \param[in] reconect 1 if we should not automatically reconnect
+ * \return negative on error, 0 on success
+ */
+int osmo_stream_cli_open2(struct osmo_stream_cli *cli, int reconnect)
+{
+ int ret;
+
+ /* we are reconfiguring this socket, close existing first. */
+ if ((cli->flags & OSMO_STREAM_CLI_F_RECONF) && cli->ofd.fd >= 0)
+ osmo_stream_cli_close(cli);
+
+ cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;
+
+ switch (cli->proto) {
+#ifdef HAVE_LIBSCTP
+ case IPPROTO_SCTP:
+ ret = osmo_sock_init2_multiaddr2(AF_UNSPEC, SOCK_STREAM, cli->proto,
+ (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,
+ (const char **)cli->addr, cli->addrcnt, cli->port,
+ OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK,
+ &cli->ma_pars);
+ break;
+#endif
+ default:
+ ret = osmo_sock_init2(AF_UNSPEC, SOCK_STREAM, cli->proto,
+ cli->local_addr[0], cli->local_port,
+ cli->addr[0], cli->port,
+ OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
+ }
+
+ if (ret < 0) {
+ if (reconnect)
+ osmo_stream_cli_reconnect(cli);
+ return ret;
+ }
+ osmo_fd_setup(&cli->ofd, ret, OSMO_FD_READ | OSMO_FD_WRITE, osmo_stream_cli_fd_cb, cli, 0);
+
+ if (cli->flags & OSMO_STREAM_CLI_F_NODELAY) {
+ ret = stream_setsockopt_nodelay(cli->ofd.fd, cli->proto, 1);
+ if (ret < 0)
+ goto error_close_socket;
+ }
+
+ if (osmo_fd_register(&cli->ofd) < 0)
+ goto error_close_socket;
+
+ cli->state = STREAM_CLI_STATE_CONNECTING;
+ return 0;
+
+error_close_socket:
+ close(cli->ofd.fd);
+ cli->ofd.fd = -1;
+ return -EIO;
+}
+
+/*! Set the NODELAY socket option to avoid Nagle-like behavior.
+ * Setting this to nodelay=true will automatically set the NODELAY
+ * socket option on any socket established via \ref osmo_stream_cli_open
+ * or any re-connect. You have to set this _before_ opening the
+ * socket.
+ * \param[in] cli Stream client whose sockets are to be configured
+ * \param[in] nodelay whether to set (true) NODELAY before connect()
+ */
+void osmo_stream_cli_set_nodelay(struct osmo_stream_cli *cli, bool nodelay)
+{
+ if (nodelay)
+ cli->flags |= OSMO_STREAM_CLI_F_NODELAY;
+ else
+ cli->flags &= ~OSMO_STREAM_CLI_F_NODELAY;
+}
+
+/*! Open connection of an Osmocom stream client.
+ * This will initiate an non-blocking outbound connect to the configured destination (server) address.
+ * By default the client will automatically attempt to reconnect after default timeout.
+ * To disable this, use osmo_stream_cli_set_reconnect_timeout() before calling this function.
+ * \param[in] cli Stream Client to connect
+ * \return negative on error, 0 on success */
+int osmo_stream_cli_open(struct osmo_stream_cli *cli)
+{
+ int ret, flags;
+ int fd = -1;
+ unsigned int local_addrcnt;
+
+ /* we are reconfiguring this socket, close existing first. */
+ if ((cli->flags & OSMO_STREAM_CLI_F_RECONF) && osmo_stream_cli_get_fd(cli) >= 0)
+ osmo_stream_cli_close(cli);
+
+ cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;
+
+ switch (cli->sk_domain) {
+ case AF_UNIX:
+ ret = osmo_sock_unix_init(cli->sk_type, 0, cli->addr[0], OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
+ break;
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ switch (cli->proto) {
+#ifdef HAVE_LIBSCTP
+ case IPPROTO_SCTP:
+ local_addrcnt = cli->local_addrcnt;
+ flags = OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_NONBLOCK;
+ if (cli->local_addrcnt > 0 || cli->local_port > 0) { /* explicit bind required? */
+ flags |= OSMO_SOCK_F_BIND;
+ /* If no local addr configured, use local_addr[0]=NULL by default when creating the socket. */
+ if (cli->local_addrcnt == 0)
+ local_addrcnt = 1;
+ }
+ ret = osmo_sock_init2_multiaddr2(cli->sk_domain, cli->sk_type, cli->proto,
+ (const char **)cli->local_addr, local_addrcnt, cli->local_port,
+ (const char **)cli->addr, cli->addrcnt, cli->port,
+ flags, &cli->ma_pars);
+ break;
+#endif
+ default:
+ ret = osmo_sock_init2(cli->sk_domain, cli->sk_type, cli->proto,
+ cli->local_addr[0], cli->local_port,
+ cli->addr[0], cli->port,
+ OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);
+ }
+ break;
+ default:
+ return -ENOTSUP;
+ }
+
+ if (ret < 0) {
+ osmo_stream_cli_reconnect(cli);
+ return ret;
+ }
+
+ fd = ret;
+
+ if (cli->flags & OSMO_STREAM_CLI_F_NODELAY) {
+ ret = stream_setsockopt_nodelay(fd, cli->proto, 1);
+ if (ret < 0)
+ goto error_close_socket;
+ }
+
+ switch (cli->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ osmo_fd_setup(&cli->ofd, fd, OSMO_FD_READ | OSMO_FD_WRITE, osmo_stream_cli_fd_cb, cli, 0);
+ if (osmo_fd_register(&cli->ofd) < 0)
+ goto error_close_socket;
+ break;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ /* Be sure that previous osmo_io instance is freed before creating a new one. */
+ osmo_stream_cli_close_iofd(cli);
+#ifdef HAVE_LIBSCTP
+ if (cli->proto == IPPROTO_SCTP) {
+ cli->iofd = osmo_iofd_setup(cli, fd, cli->name, OSMO_IO_FD_MODE_RECVMSG_SENDMSG,
+ &osmo_stream_cli_ioops_sctp, cli);
+ if (cli->iofd)
+ osmo_iofd_set_cmsg_size(cli->iofd, CMSG_SPACE(sizeof(struct sctp_sndrcvinfo)));
+ } else {
+#else
+ if (true) {
+#endif
+ cli->iofd = osmo_iofd_setup(cli, fd, cli->name, OSMO_IO_FD_MODE_READ_WRITE,
+ &osmo_stream_cli_ioops, cli);
+ }
+ if (!cli->iofd)
+ goto error_close_socket;
+
+ osmo_iofd_notify_connected(cli->iofd);
+
+ configure_cli_segmentation_cb(cli, cli->segmentation_cb);
+
+ if (osmo_iofd_register(cli->iofd, fd) < 0)
+ goto error_close_socket;
+ break;
+ default:
+ OSMO_ASSERT(false);
+ }
+
+ cli->state = STREAM_CLI_STATE_CONNECTING;
+ return 0;
+
+error_close_socket:
+ cli->state = STREAM_CLI_STATE_CLOSED;
+ close(fd);
+ if (cli->mode == OSMO_STREAM_MODE_OSMO_FD)
+ cli->ofd.fd = -1;
+ return -EIO;
+}
+
+static void cli_timer_cb(void *data)
+{
+ struct osmo_stream_cli *cli = data;
+
+ LOGSCLI(cli, LOGL_DEBUG, "reconnecting\n");
+ osmo_stream_cli_open(cli);
+}
+
+/*! Enqueue data to be sent via an Osmocom stream client..
+ * This is the function you use for writing/sending/transmitting data via the osmo_stream_cli.
+ * \param[in] cli Stream Client through which we want to send
+ * \param[in] msg Message buffer to enqueue in transmit queue */
+void osmo_stream_cli_send(struct osmo_stream_cli *cli, struct msgb *msg)
+{
+ int rc;
+
+ OSMO_ASSERT(cli);
+ OSMO_ASSERT(msg);
+
+ if (!osmo_stream_cli_is_connected(cli)) {
+ LOGSCLI(cli, LOGL_ERROR, "send: not connected, dropping data!\n");
+ msgb_free(msg);
+ return;
+ }
+
+ switch (cli->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ msgb_enqueue(&cli->tx_queue, msg);
+ osmo_fd_write_enable(&cli->ofd);
+ break;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ /* whenever osmo_stream_cli_is_connected() [see above check], we should have an iofd */
+ OSMO_ASSERT(cli->iofd);
+ if (cli->proto == IPPROTO_SCTP)
+ rc = stream_iofd_sctp_send_msgb(cli->iofd, msg, MSG_NOSIGNAL);
+ else
+ rc = osmo_iofd_write_msgb(cli->iofd, msg);
+ if (rc < 0)
+ msgb_free(msg);
+ break;
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+/*! Receive data via an Osmocom stream client in osmo_fd mode.
+ * \param[in] cli Stream Client through which we want to send
+ * \param msg pre-allocate message buffer to which received data is appended
+ * \returns number of bytes read; <=0 in case of error
+ *
+ * Application programs using the legacy osmo_fd mode of osmo_stream_cli will use
+ * this function to read/receive from a stream client socket after they have been notified that
+ * it is readable (via select/poll).
+ *
+ * If conn is an SCTP connection, additional specific considerations shall be taken:
+ * - msg->cb is always filled with SCTP ppid, and SCTP stream values, see msgb_sctp_*() APIs.
+ * - If an SCTP notification was received when reading from the SCTP socket,
+ * msgb_sctp_msg_flags(msg) will contain bit flag
+ * OSMO_STREAM_SCTP_MSG_FLAGS_NOTIFICATION set, and the msgb will
+ * contain a "union sctp_notification" instead of user data. In this case the
+ * return code will be either 0 (if conn is considered dead after the
+ * notification) or -EAGAIN (if conn is considered still alive after the
+ * notification) resembling the standard recv() API.
+ */
+int osmo_stream_cli_recv(struct osmo_stream_cli *cli, struct msgb *msg)
+{
+ int ret;
+ OSMO_ASSERT(cli);
+ OSMO_ASSERT(msg);
+ OSMO_ASSERT(cli->mode == OSMO_STREAM_MODE_OSMO_FD);
+
+ switch (cli->sk_domain) {
+ case AF_UNIX:
+ ret = recv(cli->ofd.fd, msg->tail, msgb_tailroom(msg), 0);
+ break;
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ switch (cli->proto) {
+#ifdef HAVE_LIBSCTP
+ case IPPROTO_SCTP:
+ {
+ char log_pfx[128];
+ snprintf(log_pfx, sizeof(log_pfx), "CLICONN(%s,%s)", cli->name ? : "", cli->sockname);
+ ret = stream_sctp_recvmsg_wrapper(cli->ofd.fd, msg, log_pfx);
+ break;
+ }
+#endif
+ case IPPROTO_TCP:
+ default:
+ ret = recv(cli->ofd.fd, msg->tail, msgb_tailroom(msg), 0);
+ break;
+ }
+ break;
+ default:
+ ret = -ENOTSUP;
+ }
+
+ if (ret < 0) {
+ if (ret == -EAGAIN)
+ return ret;
+ if (errno == EPIPE || errno == ECONNRESET)
+ LOGSCLI(cli, LOGL_ERROR, "lost connection with srv\n");
+ osmo_stream_cli_reconnect(cli);
+ return ret;
+ } else if (ret == 0) {
+ LOGSCLI(cli, LOGL_ERROR, "connection closed with srv\n");
+ osmo_stream_cli_reconnect(cli);
+ return ret;
+ }
+ msgb_put(msg, ret);
+ LOGSCLI(cli, LOGL_DEBUG, "received %d bytes from srv\n", ret);
+ return ret;
+}
+
+/*! Clear the transmit queue of the stream client.
+ * Calling this function wil clear (delete) any pending, not-yet transmitted data from the transmit queue. */
+void osmo_stream_cli_clear_tx_queue(struct osmo_stream_cli *cli)
+{
+ switch (cli->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ msgb_queue_free(&cli->tx_queue);
+ /* If in state 'connecting', keep WRITE flag up to receive
+ * socket connection signal and then transition to STATE_CONNECTED: */
+ if (cli->state == STREAM_CLI_STATE_CONNECTED)
+ osmo_fd_write_disable(&cli->ofd);
+ break;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ osmo_iofd_txqueue_clear(cli->iofd);
+ break;
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+/*! Set given parameter of stream client to given value.
+ * \param[in] cli stream client on which to set parameter.
+ * \param[in] par identifier of the parameter to be set.
+ * \param[in] val value of the parameter to be set.
+ * \param[in] val_len length of the parameter value.
+ * \returns 0 in success; negative -errno on error. */
+int osmo_stream_cli_set_param(struct osmo_stream_cli *cli, enum osmo_stream_cli_param par, void *val, size_t val_len)
+{
+ OSMO_ASSERT(cli);
+ uint8_t val8;
+
+ switch (par) {
+ case OSMO_STREAM_CLI_PAR_SCTP_SOCKOPT_AUTH_SUPPORTED:
+ if (!val || val_len != sizeof(uint8_t))
+ return -EINVAL;
+ val8 = *(uint8_t *)val;
+ cli->ma_pars.sctp.sockopt_auth_supported.set = true;
+ cli->ma_pars.sctp.sockopt_auth_supported.abort_on_failure = val8 > 1;
+ cli->ma_pars.sctp.sockopt_auth_supported.value = (val8 == 1 || val8 == 3) ? 1 : 0;
+ break;
+ case OSMO_STREAM_CLI_PAR_SCTP_SOCKOPT_ASCONF_SUPPORTED:
+ if (!val || val_len != sizeof(uint8_t))
+ return -EINVAL;
+ val8 = *(uint8_t *)val;
+ cli->ma_pars.sctp.sockopt_asconf_supported.set = true;
+ cli->ma_pars.sctp.sockopt_asconf_supported.abort_on_failure = val8 > 1;
+ cli->ma_pars.sctp.sockopt_asconf_supported.value = (val8 == 1 || val8 == 3) ? 1 : 0;
+ break;
+ case OSMO_STREAM_CLI_PAR_SCTP_INIT_NUM_OSTREAMS:
+ if (!val || val_len != sizeof(uint16_t))
+ return -EINVAL;
+ cli->ma_pars.sctp.sockopt_initmsg.set = true;
+ cli->ma_pars.sctp.sockopt_initmsg.num_ostreams_present = true;
+ cli->ma_pars.sctp.sockopt_initmsg.num_ostreams_value = *(uint16_t *)val;
+ break;
+ case OSMO_STREAM_CLI_PAR_SCTP_INIT_MAX_INSTREAMS:
+ if (!val || val_len != sizeof(uint16_t))
+ return -EINVAL;
+ cli->ma_pars.sctp.sockopt_initmsg.set = true;
+ cli->ma_pars.sctp.sockopt_initmsg.max_instreams_present = true;
+ cli->ma_pars.sctp.sockopt_initmsg.max_instreams_value = *(uint16_t *)val;
+ break;
+ case OSMO_STREAM_CLI_PAR_SCTP_INIT_MAX_ATTEMPTS:
+ if (!val || val_len != sizeof(uint16_t))
+ return -EINVAL;
+ cli->ma_pars.sctp.sockopt_initmsg.set = true;
+ cli->ma_pars.sctp.sockopt_initmsg.max_attempts_present = true;
+ cli->ma_pars.sctp.sockopt_initmsg.max_attempts_value = *(uint16_t *)val;
+ break;
+ case OSMO_STREAM_CLI_PAR_SCTP_INIT_TIMEOUT:
+ if (!val || val_len != sizeof(uint16_t))
+ return -EINVAL;
+ cli->ma_pars.sctp.sockopt_initmsg.set = true;
+ cli->ma_pars.sctp.sockopt_initmsg.max_init_timeo_present = true;
+ cli->ma_pars.sctp.sockopt_initmsg.max_init_timeo_value = *(uint16_t *)val;
+ break;
+ default:
+ return -ENOENT;
+ };
+ return 0;
+}
+
+/*! @} */
diff --git a/src/stream_srv.c b/src/stream_srv.c
new file mode 100644
index 0000000..dad6b7a
--- /dev/null
+++ b/src/stream_srv.c
@@ -0,0 +1,1215 @@
+/* (C) 2011 by Pablo Neira Ayuso <pablo@gnumonks.org>
+ * (C) 2015-2016 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2023 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * All Rights Reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <time.h>
+#include <sys/fcntl.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/ioctl.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/tcp.h>
+
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/osmo_io.h>
+#include <osmocom/core/panic.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/socket.h>
+
+#include <osmocom/netif/stream.h>
+#include <osmocom/netif/stream_private.h>
+
+#include "config.h"
+
+#include <osmocom/netif/sctp.h>
+
+/*! \file stream_srv.c */
+
+#define LOGSLNK(link, level, fmt, args...) \
+ LOGP(DLINP, level, "SRV(%s,%s) " fmt, \
+ link->name ? : "", \
+ link->sockname, \
+ ## args)
+
+#define LOGSSRV(srv, level, fmt, args...) \
+ LOGP(DLINP, level, "SRVCONN(%s,%s) " fmt, \
+ srv->name ? : "", \
+ srv->sockname, \
+ ## args)
+/*
+ * Server side.
+ */
+
+#define OSMO_STREAM_SRV_F_RECONF (1 << 0)
+#define OSMO_STREAM_SRV_F_NODELAY (1 << 1)
+
+struct osmo_stream_srv_link {
+ struct osmo_fd ofd;
+ char *name;
+ char sockname[OSMO_SOCK_MULTIADDR_PEER_STR_MAXLEN];
+ char *addr[OSMO_STREAM_MAX_ADDRS];
+ uint8_t addrcnt;
+ uint16_t port;
+ int sk_domain;
+ int sk_type;
+ uint16_t proto;
+ osmo_stream_srv_link_accept_cb_t accept_cb;
+ void *data;
+ int flags;
+ struct osmo_sock_init2_multiaddr_pars ma_pars;
+};
+
+static int _setsockopt_nosigpipe(struct osmo_stream_srv_link *link, int new_fd)
+{
+#ifdef SO_NOSIGPIPE
+ int ret;
+ int val = 1;
+ ret = setsockopt(new_fd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&val, sizeof(val));
+ if (ret < 0)
+ LOGSLNK(link, LOGL_ERROR, "Failed setting SO_NOSIGPIPE: %s\n", strerror(errno));
+ return ret;
+#else
+ return 0;
+#endif
+}
+
+static int osmo_stream_srv_link_ofd_cb(struct osmo_fd *ofd, unsigned int what)
+{
+ int ret;
+ int sock_fd;
+ struct osmo_sockaddr osa;
+ socklen_t sa_len = sizeof(osa.u.sas);
+ struct osmo_stream_srv_link *link = ofd->data;
+
+ ret = accept(ofd->fd, &osa.u.sa, &sa_len);
+ if (ret < 0) {
+ LOGSLNK(link, LOGL_ERROR, "failed to accept from origin peer, reason=`%s'\n",
+ strerror(errno));
+ return ret;
+ }
+ sock_fd = ret;
+
+ switch (osa.u.sa.sa_family) {
+ case AF_UNIX:
+ LOGSLNK(link, LOGL_INFO, "accept()ed new link on fd %d\n",
+ sock_fd);
+ _setsockopt_nosigpipe(link, sock_fd);
+ break;
+ case AF_INET6:
+ case AF_INET:
+ LOGSLNK(link, LOGL_INFO, "accept()ed new link from %s\n",
+ osmo_sockaddr_to_str(&osa));
+
+ if (link->proto == IPPROTO_SCTP) {
+ _setsockopt_nosigpipe(link, sock_fd);
+ ret = stream_sctp_sock_activate_events(sock_fd);
+ if (ret < 0)
+ goto error_close_socket;
+ }
+ break;
+ default:
+ LOGSLNK(link, LOGL_ERROR, "accept()ed unexpected address family %d\n",
+ osa.u.sa.sa_family);
+ goto error_close_socket;
+ }
+
+ if (link->flags & OSMO_STREAM_SRV_F_NODELAY) {
+ ret = stream_setsockopt_nodelay(sock_fd, link->proto, 1);
+ if (ret < 0)
+ goto error_close_socket;
+ }
+
+ if (!link->accept_cb) {
+ ret = -ENOTSUP;
+ goto error_close_socket;
+ }
+
+ ret = link->accept_cb(link, sock_fd);
+ if (ret)
+ goto error_close_socket;
+ return 0;
+
+error_close_socket:
+ close(sock_fd);
+ return ret;
+}
+
+/*! \addtogroup stream_srv
+ * @{
+ */
+
+/*! Create an Osmocom Stream Server Link.
+ * A Stream Server Link is the listen()+accept() "parent" to individual connections from remote clients.
+ * \param[in] ctx talloc allocation context
+ * \returns Stream Server Link with default values (AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP)
+ */
+struct osmo_stream_srv_link *osmo_stream_srv_link_create(void *ctx)
+{
+ struct osmo_stream_srv_link *link;
+
+ link = talloc_zero(ctx, struct osmo_stream_srv_link);
+ if (!link)
+ return NULL;
+
+ link->sk_domain = AF_UNSPEC;
+ link->sk_type = SOCK_STREAM;
+ link->proto = IPPROTO_TCP;
+ osmo_fd_setup(&link->ofd, -1, OSMO_FD_READ | OSMO_FD_WRITE, osmo_stream_srv_link_ofd_cb, link, 0);
+
+ link->ma_pars.sctp.version = 0;
+
+ return link;
+}
+
+/*! Set a name on the srv_link object (used during logging).
+ * \param[in] link server link whose name is to be set. The name is copied into the osmo_stream_srv_link, so
+ * the caller memory is not required to be valid beyond the call of this function.
+ * \param[in] name the name to be set on link
+ */
+void osmo_stream_srv_link_set_name(struct osmo_stream_srv_link *link, const char *name)
+{
+ osmo_talloc_replace_string(link, &link->name, name);
+}
+
+/*! Retrieve name previously set on the srv_link object (see osmo_stream_srv_link_set_name()).
+ * \param[in] link server link whose name is to be retrieved
+ * \returns The name to be set on link; NULL if never set
+ */
+const char *osmo_stream_srv_link_get_name(const struct osmo_stream_srv_link *link)
+{
+ return link->name;
+}
+
+/*! Set the NODELAY socket option to avoid Nagle-like behavior.
+ * Setting this to nodelay=true will automatically set the NODELAY
+ * socket option on any socket established via this server link, before
+ * calling the accept_cb()
+ * \param[in] link server link whose sockets are to be configured
+ * \param[in] nodelay whether to set (true) NODELAY after accept
+ */
+void osmo_stream_srv_link_set_nodelay(struct osmo_stream_srv_link *link, bool nodelay)
+{
+ if (nodelay)
+ link->flags |= OSMO_STREAM_SRV_F_NODELAY;
+ else
+ link->flags &= ~OSMO_STREAM_SRV_F_NODELAY;
+}
+
+/*! Set the local address to which we bind.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] link Stream Server Link to modify
+ * \param[in] addr Local IP address
+ */
+void osmo_stream_srv_link_set_addr(struct osmo_stream_srv_link *link,
+ const char *addr)
+{
+ osmo_stream_srv_link_set_addrs(link, &addr, 1);
+}
+
+/*! Set the local address set to which we bind.
+ * Useful for protocols allowing bind on more than one address (such as SCTP)
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] link Stream Server Link to modify
+ * \param[in] addr Local IP address
+ * \return negative on error, 0 on success
+ */
+int osmo_stream_srv_link_set_addrs(struct osmo_stream_srv_link *link, const char **addr, size_t addrcnt)
+{
+ int i = 0;
+
+ if (addrcnt > OSMO_STREAM_MAX_ADDRS)
+ return -EINVAL;
+
+ for (; i < addrcnt; i++)
+ osmo_talloc_replace_string(link, &link->addr[i], addr[i]);
+ for (; i < link->addrcnt; i++) {
+ talloc_free(link->addr[i]);
+ link->addr[i] = NULL;
+ }
+
+ link->addrcnt = addrcnt;
+ link->flags |= OSMO_STREAM_SRV_F_RECONF;
+ return 0;
+}
+
+/*! Set the local port number to which we bind.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] link Stream Server Link to modify
+ * \param[in] port Local port number
+ */
+void osmo_stream_srv_link_set_port(struct osmo_stream_srv_link *link,
+ uint16_t port)
+{
+ link->port = port;
+ link->flags |= OSMO_STREAM_SRV_F_RECONF;
+}
+
+/*! Set the protocol for the stream server link.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] link Stream Server Link to modify
+ * \param[in] proto Protocol (like IPPROTO_TCP (default), IPPROTO_SCTP, ...)
+ */
+void
+osmo_stream_srv_link_set_proto(struct osmo_stream_srv_link *link,
+ uint16_t proto)
+{
+ link->proto = proto;
+ link->flags |= OSMO_STREAM_SRV_F_RECONF;
+}
+
+
+/*! Set the socket type for the stream server link.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] link Stream Server Link to modify
+ * \param[in] type Socket Type (like SOCK_STREAM (default), SOCK_SEQPACKET, ...)
+ * \returns zero on success, negative on error.
+ */
+int osmo_stream_srv_link_set_type(struct osmo_stream_srv_link *link, int type)
+{
+ switch (type) {
+ case SOCK_STREAM:
+ case SOCK_SEQPACKET:
+ break;
+ default:
+ return -ENOTSUP;
+ }
+ link->sk_type = type;
+ link->flags |= OSMO_STREAM_SRV_F_RECONF;
+ return 0;
+}
+
+/*! Set the socket type for the stream server link.
+ * Any changes to this setting will only become active upon next (re)connect.
+ * \param[in] link Stream Server Link to modify
+ * \param[in] type Socket Domain (like AF_UNSPEC (default for IP), AF_UNIX, AF_INET, ...)
+ * \returns zero on success, negative on error.
+ */
+int osmo_stream_srv_link_set_domain(struct osmo_stream_srv_link *link, int domain)
+{
+ switch (domain) {
+ case AF_UNSPEC:
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNIX:
+ break;
+ default:
+ return -ENOTSUP;
+ }
+ link->sk_domain = domain;
+ link->flags |= OSMO_STREAM_SRV_F_RECONF;
+ return 0;
+}
+
+/*! Set application private data of the stream server link.
+ * \param[in] link Stream Server Link to modify
+ * \param[in] data User-specific data (available in call-back functions) */
+void
+osmo_stream_srv_link_set_data(struct osmo_stream_srv_link *link,
+ void *data)
+{
+ link->data = data;
+}
+
+/*! Retrieve application private data of the stream server link.
+ * \param[in] link Stream Server Link to modify
+ * \returns Application private data, as set by \ref osmo_stream_cli_set_data() */
+void *osmo_stream_srv_link_get_data(struct osmo_stream_srv_link *link)
+{
+ return link->data;
+}
+
+/* Similar to osmo_sock_multiaddr_get_name_buf(), but aimed at listening sockets (only local part): */
+static char *get_local_sockname_buf(char *buf, size_t buf_len, const struct osmo_stream_srv_link *link)
+{
+ struct osmo_strbuf sb = { .buf = buf, .len = buf_len };
+ int rc;
+
+ if (buf_len > 0)
+ buf[0] = '\0';
+
+ switch (link->sk_domain) {
+ case AF_UNSPEC:
+ /* we assume INET(6) by default upon link creation: */
+ case AF_INET:
+ case AF_INET6:
+ {
+ char hostbuf[OSMO_STREAM_MAX_ADDRS][INET6_ADDRSTRLEN];
+ size_t num_hostbuf = ARRAY_SIZE(hostbuf);
+ char portbuf[6];
+ bool need_more_bufs;
+ rc = osmo_sock_multiaddr_get_ip_and_port(link->ofd.fd, link->proto, &hostbuf[0][0],
+ &num_hostbuf, sizeof(hostbuf[0]),
+ portbuf, sizeof(portbuf), true);
+ if (rc < 0)
+ return NULL;
+ need_more_bufs = num_hostbuf > ARRAY_SIZE(hostbuf);
+ if (need_more_bufs)
+ num_hostbuf = ARRAY_SIZE(hostbuf);
+ OSMO_STRBUF_APPEND(sb, osmo_multiaddr_ip_and_port_snprintf,
+ &hostbuf[0][0], num_hostbuf, sizeof(hostbuf[0]), portbuf);
+ if (need_more_bufs)
+ OSMO_STRBUF_PRINTF(sb, "<need-more-bufs!>");
+ return buf;
+ }
+ case AF_UNIX:
+ {
+ struct osmo_sockaddr osa;
+ struct sockaddr_un *sun;
+ socklen_t len = sizeof(osa.u.sas);
+ rc = getsockname(link->ofd.fd, &osa.u.sa, &len);
+ if (rc < 0) {
+ OSMO_STRBUF_PRINTF(sb, "<error-in-getsockname>");
+ return buf;
+ }
+ /* Make sure sun_path is NULL terminated: */
+ sun = (struct sockaddr_un *)&osa.u.sa;
+ sun->sun_path[sizeof(sun->sun_path) - 1] = '\0';
+ OSMO_STRBUF_PRINTF(sb, "%s", sun->sun_path);
+ return buf;
+ }
+ default:
+ return NULL;
+ }
+}
+
+/*! Retrieve description of the stream server link e. g. 127.0.0.1:1234.
+ * Calling this function will build a string that describes the socket in terms of its local/remote
+ * address/port. The returned name is stored in a static buffer; it is hence not re-entrant or thread-safe.
+ * \param[in] link Stream Server Link to examine
+ * \returns Link description or NULL in case of error */
+char *osmo_stream_srv_link_get_sockname(const struct osmo_stream_srv_link *link)
+{
+ static char buf[sizeof(link->sockname)];
+
+ if (!get_local_sockname_buf(buf, sizeof(buf), link))
+ return NULL;
+ return buf;
+}
+
+/*! Retrieve Osmocom File Descriptor of the stream server link.
+ * \param[in] link Stream Server Link
+ * \returns Pointer to \ref osmo_fd */
+struct osmo_fd *
+osmo_stream_srv_link_get_ofd(struct osmo_stream_srv_link *link)
+{
+ return &link->ofd;
+}
+
+/*! Retrieve File Descriptor of the stream server link.
+ * \param[in] conn Stream Server Link
+ * \returns file descriptor or negative on error */
+int osmo_stream_srv_link_get_fd(const struct osmo_stream_srv_link *link)
+{
+ return link->ofd.fd;
+}
+
+/*! Set the accept() call-back of the stream server link.
+ * The provided call-back will be called whenever a new inbound connection
+ * is accept()ed. The call-back then typically creates a new osmo_stream_srv.
+ * If the call-back returns a negative value, the file descriptor will be closed.
+ * \param[in] link Stream Server Link
+ * \param[in] accept_cb Call-back function executed upon accept() */
+void osmo_stream_srv_link_set_accept_cb(struct osmo_stream_srv_link *link,
+ int (*accept_cb)(struct osmo_stream_srv_link *link, int fd))
+
+{
+ link->accept_cb = accept_cb;
+}
+
+/*! Destroy the stream server link. Closes + Releases Memory.
+ * \param[in] link Stream Server Link */
+void osmo_stream_srv_link_destroy(struct osmo_stream_srv_link *link)
+{
+ osmo_stream_srv_link_close(link);
+ talloc_free(link);
+}
+
+/*! Open the stream server link. This actually initializes the
+ * underlying socket and binds it to the configured ip/port.
+ * \param[in] link Stream Server Link to open
+ * \return negative on error, 0 on success */
+int osmo_stream_srv_link_open(struct osmo_stream_srv_link *link)
+{
+ int ret;
+
+ if (link->ofd.fd >= 0) {
+ /* No reconfigure needed for existing socket, we are fine */
+ if (!(link->flags & OSMO_STREAM_SRV_F_RECONF))
+ return 0;
+ /* we are reconfiguring this socket, close existing first. */
+ osmo_stream_srv_link_close(link);
+ }
+
+ link->flags &= ~OSMO_STREAM_SRV_F_RECONF;
+
+ switch (link->sk_domain) {
+ case AF_UNIX:
+ ret = osmo_sock_unix_init(link->sk_type, 0, link->addr[0], OSMO_SOCK_F_BIND);
+ break;
+ case AF_UNSPEC:
+ case AF_INET:
+ case AF_INET6:
+ switch (link->proto) {
+#ifdef HAVE_LIBSCTP
+ case IPPROTO_SCTP:
+ ret = osmo_sock_init2_multiaddr2(link->sk_domain, link->sk_type, link->proto,
+ (const char **)link->addr, link->addrcnt, link->port,
+ NULL, 0, 0, OSMO_SOCK_F_BIND, &link->ma_pars);
+ break;
+#endif
+ default:
+ ret = osmo_sock_init(link->sk_domain, link->sk_type, link->proto,
+ link->addr[0], link->port, OSMO_SOCK_F_BIND);
+ }
+ break;
+ default:
+ ret = -ENOTSUP;
+ }
+ if (ret < 0)
+ return ret;
+
+ link->ofd.fd = ret;
+ if (osmo_fd_register(&link->ofd) < 0) {
+ close(ret);
+ link->ofd.fd = -1;
+ return -EIO;
+ }
+
+ get_local_sockname_buf(link->sockname, sizeof(link->sockname), link);
+ return 0;
+}
+
+/*! Check whether the stream server link is opened.
+ * \param[in] link Stream Server Link to check */
+bool osmo_stream_srv_link_is_opened(const struct osmo_stream_srv_link *link)
+{
+ if (!link)
+ return false;
+
+ if (link->ofd.fd == -1)
+ return false;
+
+ return true;
+}
+
+/*! Close the stream server link and unregister from select loop.
+ * Does not destroy the server link, merely closes it!
+ * \param[in] link Stream Server Link to close */
+void osmo_stream_srv_link_close(struct osmo_stream_srv_link *link)
+{
+ if (!osmo_stream_srv_link_is_opened(link))
+ return;
+
+ osmo_fd_unregister(&link->ofd);
+ close(link->ofd.fd);
+ link->ofd.fd = -1;
+}
+
+/*! Set given parameter of stream_srv_link to given value.
+ * \param[in] cli stream client on which to set parameter.
+ * \param[in] par identifier of the parameter to be set.
+ * \param[in] val value of the parameter to be set.
+ * \param[in] val_len length of the parameter value.
+ * \returns 0 in success; negative -errno on error. */
+int osmo_stream_srv_link_set_param(struct osmo_stream_srv_link *link, enum osmo_stream_srv_link_param par,
+ void *val, size_t val_len)
+{
+ OSMO_ASSERT(link);
+ uint8_t val8;
+
+ switch (par) {
+ case OSMO_STREAM_SRV_LINK_PAR_SCTP_SOCKOPT_AUTH_SUPPORTED:
+ if (!val || val_len != sizeof(uint8_t))
+ return -EINVAL;
+ val8 = *(uint8_t *)val;
+ link->ma_pars.sctp.sockopt_auth_supported.set = true;
+ link->ma_pars.sctp.sockopt_auth_supported.abort_on_failure = val8 > 1;
+ link->ma_pars.sctp.sockopt_auth_supported.value = (val8 == 1 || val8 == 3) ? 1 : 0;
+ break;
+ case OSMO_STREAM_SRV_LINK_PAR_SCTP_SOCKOPT_ASCONF_SUPPORTED:
+ if (!val || val_len != sizeof(uint8_t))
+ return -EINVAL;
+ val8 = *(uint8_t *)val;
+ link->ma_pars.sctp.sockopt_asconf_supported.set = true;
+ link->ma_pars.sctp.sockopt_asconf_supported.abort_on_failure = val8 > 1;
+ link->ma_pars.sctp.sockopt_asconf_supported.value = (val8 == 1 || val8 == 3) ? 1 : 0;
+ break;
+ case OSMO_STREAM_SRV_LINK_PAR_SCTP_INIT_NUM_OSTREAMS:
+ if (!val || val_len != sizeof(uint16_t))
+ return -EINVAL;
+ link->ma_pars.sctp.sockopt_initmsg.set = true;
+ link->ma_pars.sctp.sockopt_initmsg.num_ostreams_present = true;
+ link->ma_pars.sctp.sockopt_initmsg.num_ostreams_value = *(uint16_t *)val;
+ break;
+ case OSMO_STREAM_SRV_LINK_PAR_SCTP_INIT_MAX_INSTREAMS:
+ if (!val || val_len != sizeof(uint16_t))
+ return -EINVAL;
+ link->ma_pars.sctp.sockopt_initmsg.set = true;
+ link->ma_pars.sctp.sockopt_initmsg.max_instreams_present = true;
+ link->ma_pars.sctp.sockopt_initmsg.max_instreams_value = *(uint16_t *)val;
+ break;
+ default:
+ return -ENOENT;
+ };
+ return 0;
+}
+
+/*! @} */
+
+#define OSMO_STREAM_SRV_F_FLUSH_DESTROY (1 << 0)
+
+struct osmo_stream_srv {
+ struct osmo_stream_srv_link *srv;
+ char *name;
+ char sockname[OSMO_SOCK_NAME_MAXLEN];
+ enum osmo_stream_mode mode;
+ union {
+ struct osmo_fd ofd;
+ struct osmo_io_fd *iofd;
+ };
+ struct llist_head tx_queue;
+ osmo_stream_srv_closed_cb_t closed_cb;
+ osmo_stream_srv_read_cb_t read_cb;
+ osmo_stream_srv_read_cb2_t iofd_read_cb;
+ void *data;
+ int flags;
+};
+
+/*! \addtogroup stream_srv
+ * @{
+ */
+
+static void stream_srv_iofd_read_cb(struct osmo_io_fd *iofd, int res, struct msgb *msg)
+{
+ struct osmo_stream_srv *conn = osmo_iofd_get_data(iofd);
+
+ switch (res) {
+ case -EPIPE:
+ case -ECONNRESET:
+ LOGSSRV(conn, LOGL_ERROR, "lost connection with client (%d)\n", res);
+ break;
+ case 0:
+ LOGSSRV(conn, LOGL_NOTICE, "connection closed with client\n");
+ break;
+ default:
+ LOGSSRV(conn, LOGL_DEBUG, "received %d bytes from client\n", res);
+ break;
+ }
+ if (OSMO_UNLIKELY(conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY)) {
+ LOGSSRV(conn, LOGL_INFO, "Connection is being flushed and closed; ignoring received message\n");
+ msgb_free(msg);
+ if (osmo_iofd_txqueue_len(iofd) == 0)
+ osmo_stream_srv_destroy(conn);
+ return;
+ }
+
+ if (conn->iofd_read_cb)
+ conn->iofd_read_cb(conn, res, msg);
+ else
+ msgb_free(msg);
+}
+
+static void stream_srv_iofd_write_cb(struct osmo_io_fd *iofd, int res, struct msgb *msg)
+{
+ struct osmo_stream_srv *conn = osmo_iofd_get_data(iofd);
+ LOGSSRV(conn, LOGL_DEBUG, "connected write\n");
+
+ if (res < 0)
+ LOGSSRV(conn, LOGL_ERROR, "error to send: %s\n", strerror(errno));
+
+ if (osmo_iofd_txqueue_len(iofd) == 0)
+ if (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY)
+ osmo_stream_srv_destroy(conn);
+}
+
+static const struct osmo_io_ops srv_ioops = {
+ .read_cb = stream_srv_iofd_read_cb,
+ .write_cb = stream_srv_iofd_write_cb,
+};
+
+#ifdef HAVE_LIBSCTP
+static void stream_srv_iofd_recvmsg_cb(struct osmo_io_fd *iofd, int res, struct msgb *msg, const struct msghdr *msgh)
+{
+ struct osmo_stream_srv *conn = osmo_iofd_get_data(iofd);
+ LOGSSRV(conn, LOGL_DEBUG, "message received (res=%d)\n", res);
+
+ res = stream_iofd_sctp_recvmsg_trailer(iofd, msg, res, msgh);
+
+ switch (res) {
+ case -EPIPE:
+ case -ECONNRESET:
+ LOGSSRV(conn, LOGL_ERROR, "lost connection with client (%d)\n", res);
+ break;
+ case 0:
+ LOGSSRV(conn, LOGL_NOTICE, "connection closed with client\n");
+ break;
+ default:
+ if (OSMO_LIKELY(res > 0))
+ LOGSSRV(conn, LOGL_DEBUG, "received %u bytes from client\n", res);
+ break;
+ }
+ if (OSMO_UNLIKELY(conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY)) {
+ LOGSSRV(conn, LOGL_INFO, "Connection is being flushed and closed; ignoring received message\n");
+ msgb_free(msg);
+ if (osmo_iofd_txqueue_len(iofd) == 0)
+ osmo_stream_srv_destroy(conn);
+ return;
+ }
+
+ if (conn->iofd_read_cb)
+ conn->iofd_read_cb(conn, res, msg);
+ else
+ msgb_free(msg);
+}
+
+static const struct osmo_io_ops srv_ioops_sctp = {
+ .recvmsg_cb = stream_srv_iofd_recvmsg_cb,
+ .sendmsg_cb = stream_srv_iofd_write_cb,
+};
+#endif
+
+static int osmo_stream_srv_read(struct osmo_stream_srv *conn)
+{
+ int rc = 0;
+
+ LOGSSRV(conn, LOGL_DEBUG, "message received\n");
+
+ if (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY) {
+ LOGSSRV(conn, LOGL_INFO, "Connection is being flushed and closed; ignoring received message\n");
+ return 0;
+ }
+
+ if (conn->read_cb)
+ rc = conn->read_cb(conn);
+
+ return rc;
+}
+
+static void osmo_stream_srv_write(struct osmo_stream_srv *conn)
+{
+#ifdef HAVE_LIBSCTP
+ struct sctp_sndrcvinfo sinfo;
+#endif
+ struct msgb *msg;
+ int ret;
+
+ if (llist_empty(&conn->tx_queue)) {
+ osmo_fd_write_disable(&conn->ofd);
+ return;
+ }
+ msg = llist_first_entry(&conn->tx_queue, struct msgb, list);
+ llist_del(&msg->list);
+
+ LOGSSRV(conn, LOGL_DEBUG, "sending %u bytes of data\n", msg->len);
+
+ switch (conn->srv->sk_domain) {
+ case AF_UNIX:
+ ret = send(conn->ofd.fd, msgb_data(msg), msgb_length(msg), 0);
+ break;
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ switch (conn->srv->proto) {
+#ifdef HAVE_LIBSCTP
+ case IPPROTO_SCTP:
+ memset(&sinfo, 0, sizeof(sinfo));
+ sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));
+ sinfo.sinfo_stream = msgb_sctp_stream(msg);
+ ret = sctp_send(conn->ofd.fd, msgb_data(msg), msgb_length(msg),
+ &sinfo, MSG_NOSIGNAL);
+ break;
+#endif
+ case IPPROTO_TCP:
+ default:
+ ret = send(conn->ofd.fd, msgb_data(msg), msgb_length(msg), 0);
+ break;
+ }
+ break;
+ default:
+ ret = -1;
+ errno = ENOTSUP;
+ }
+
+ if (ret >= 0 && ret < msgb_length(msg)) {
+ LOGSSRV(conn, LOGL_ERROR, "short send: %d < exp %u\n", ret, msgb_length(msg));
+ /* Update msgb and re-add it at the start of the queue: */
+ msgb_pull(msg, ret);
+ llist_add(&msg->list, &conn->tx_queue);
+ return;
+ }
+
+ if (ret == -1) {/* send(): On error -1 is returned, and errno is set appropriately */
+ int err = errno;
+ LOGSSRV(conn, LOGL_ERROR, "send(len=%u) error: %s\n", msgb_length(msg), strerror(err));
+ if (err == EAGAIN) {
+ /* Re-add at the start of the queue to re-attempt: */
+ llist_add(&msg->list, &conn->tx_queue);
+ return;
+ }
+ msgb_free(msg);
+ osmo_stream_srv_destroy(conn);
+ return;
+ }
+
+ msgb_free(msg);
+
+ if (llist_empty(&conn->tx_queue)) {
+ osmo_fd_write_disable(&conn->ofd);
+ if (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY)
+ osmo_stream_srv_destroy(conn);
+ }
+}
+
+static int osmo_stream_srv_cb(struct osmo_fd *ofd, unsigned int what)
+{
+ struct osmo_stream_srv *conn = ofd->data;
+ int rc = 0;
+
+ LOGSSRV(conn, LOGL_DEBUG, "connected read/write (what=0x%x)\n", what);
+ if (what & OSMO_FD_READ)
+ rc = osmo_stream_srv_read(conn);
+ if (rc != -EBADF && (what & OSMO_FD_WRITE))
+ osmo_stream_srv_write(conn);
+
+ return rc;
+}
+
+
+/*! Create a legacy osmo_fd mode Stream Server inside the specified link.
+ *
+ * This is the function an application traditionally calls from within the
+ * accept_cb call-back of the osmo_stream_srv_link. It creates a new
+ * osmo_stream_srv within that link.
+ *
+ * New users/programs should use osmo_stream_srv_create2 to operate in osmo_io
+ * mode instead.
+ *
+ * \param[in] ctx talloc allocation context from which to allocate
+ * \param[in] link Stream Server Link to which we belong
+ * \param[in] fd system file descriptor of the new connection
+ * \param[in] read_cb Call-back to call when the socket is readable
+ * \param[in] closed_cb Call-back to call when the connection is closed
+ * \param[in] data User data to save in the new Stream Server struct
+ * \returns Stream Server in case of success; NULL on error */
+struct osmo_stream_srv *
+osmo_stream_srv_create(void *ctx, struct osmo_stream_srv_link *link, int fd,
+ osmo_stream_srv_read_cb_t read_cb,
+ osmo_stream_srv_closed_cb_t closed_cb,
+ void *data)
+{
+ struct osmo_stream_srv *conn;
+
+ OSMO_ASSERT(link);
+
+ conn = talloc_zero(ctx, struct osmo_stream_srv);
+ if (conn == NULL)
+ return NULL;
+
+ conn->mode = OSMO_STREAM_MODE_OSMO_FD;
+ conn->srv = link;
+ osmo_fd_setup(&conn->ofd, fd, OSMO_FD_READ, osmo_stream_srv_cb, conn, 0);
+ conn->read_cb = read_cb;
+ conn->closed_cb = closed_cb;
+ conn->data = data;
+ INIT_LLIST_HEAD(&conn->tx_queue);
+
+ osmo_sock_get_name_buf(conn->sockname, sizeof(conn->sockname), fd);
+
+ if (osmo_fd_register(&conn->ofd) < 0) {
+ LOGSSRV(conn, LOGL_ERROR, "could not register FD\n");
+ talloc_free(conn);
+ return NULL;
+ }
+ return conn;
+}
+
+/*! Create an osmo_iofd mode Stream Server inside the specified link.
+ *
+ * This is the function an application typically calls from within the
+ * accept_cb call-back of the osmo_stream_srv_link. It creates a new
+ * osmo_stream_srv in osmo_io mode within that link.
+ *
+ * \param[in] ctx talloc allocation context from which to allocate
+ * \param[in] link Stream Server Link to which we belong
+ * \param[in] fd system file descriptor of the new connection
+ * \param[in] data User data to save in the new Stream Server struct
+ * \returns Stream Server in case of success; NULL on error */
+struct osmo_stream_srv *
+osmo_stream_srv_create2(void *ctx, struct osmo_stream_srv_link *link, int fd, void *data)
+{
+ struct osmo_stream_srv *conn;
+
+ OSMO_ASSERT(link);
+
+ conn = talloc_zero(ctx, struct osmo_stream_srv);
+ if (conn == NULL)
+ return NULL;
+
+ conn->mode = OSMO_STREAM_MODE_OSMO_IO;
+ conn->srv = link;
+
+ osmo_sock_get_name_buf(conn->sockname, sizeof(conn->sockname), fd);
+
+ if (link->proto == IPPROTO_SCTP) {
+ conn->iofd = osmo_iofd_setup(conn, fd, conn->sockname, OSMO_IO_FD_MODE_RECVMSG_SENDMSG,
+ &srv_ioops_sctp, conn);
+ if (conn->iofd)
+ osmo_iofd_set_cmsg_size(conn->iofd, CMSG_SPACE(sizeof(struct sctp_sndrcvinfo)));
+ } else {
+ conn->iofd = osmo_iofd_setup(conn, fd, conn->sockname, OSMO_IO_FD_MODE_READ_WRITE,
+ &srv_ioops, conn);
+ }
+ if (!conn->iofd) {
+ talloc_free(conn);
+ return NULL;
+ }
+ conn->data = data;
+
+ if (osmo_iofd_register(conn->iofd, fd) < 0) {
+ LOGSSRV(conn, LOGL_ERROR, "could not register FD %d\n", fd);
+ talloc_free(conn);
+ return NULL;
+ }
+
+ return conn;
+}
+
+/*! Set a name on the srv object (used during logging).
+ * \param[in] conn server whose name is to be set. The name is copied into the osmo_stream_srv_link, so
+ * the caller memory is not required to be valid beyond the call of this function.
+ * \param[in] name the name to be set on conn
+ */
+void osmo_stream_srv_set_name(struct osmo_stream_srv *conn, const char *name)
+{
+ osmo_talloc_replace_string(conn, &conn->name, name);
+ if (conn->mode == OSMO_STREAM_MODE_OSMO_IO && conn->iofd)
+ osmo_iofd_set_name(conn->iofd, name);
+}
+
+/*! Retrieve name previously set on the srv object (see osmo_stream_srv_set_name()).
+ * \param[in] conn server whose name is to be retrieved
+ * \returns The name to be set on conn; NULL if never set
+ */
+const char *osmo_stream_srv_get_name(const struct osmo_stream_srv *conn)
+{
+ return conn->name;
+}
+
+/*! Set the call-back function for incoming data on an osmo_io stream_srv.
+ *
+ * This function only works with osmo_stream_srv in osmo_io mode, created by osmo_stream_srv_create2()!
+ *
+ * Whenever data is received on the osmo_stram_srv, the read_cb call-back function of the user application is
+ * called.
+ *
+ * \param[in] conn Stream Server to modify
+ * \param[in] read_cb Call-back function to be called when data was read */
+void osmo_stream_srv_set_read_cb(struct osmo_stream_srv *conn,
+ osmo_stream_srv_read_cb2_t read_cb)
+{
+ OSMO_ASSERT(conn && conn->mode == OSMO_STREAM_MODE_OSMO_IO);
+ conn->iofd_read_cb = read_cb;
+}
+
+/*! Set the call-back function called when the stream server socket was closed.
+ * Whenever the socket was closed (network error, client disconnect, etc.), the user-provided
+ * call-back function given here is called. This is typically used by the application to clean up any of its
+ * internal state related to this specific client/connection.
+ * \param[in] conn Stream Server to modify
+ * \param[in] closed_cb Call-back function to be called when the connection was closed */
+void osmo_stream_srv_set_closed_cb(struct osmo_stream_srv *conn,
+ osmo_stream_srv_closed_cb_t closed_cb)
+{
+ OSMO_ASSERT(conn);
+ conn->closed_cb = closed_cb;
+}
+
+/*! Prepare to send out all pending messages on the connection's Tx queue.
+ * and then automatically destroy the stream with osmo_stream_srv_destroy().
+ * This function disables queuing of new messages on the connection and also
+ * disables reception of new messages on the connection.
+ * \param[in] conn Stream Server to modify */
+void osmo_stream_srv_set_flush_and_destroy(struct osmo_stream_srv *conn)
+{
+ conn->flags |= OSMO_STREAM_SRV_F_FLUSH_DESTROY;
+}
+
+/*! Set application private data of the stream server.
+ * \param[in] conn Stream Server to modify
+ * \param[in] data User-specific data (available in call-back functions) */
+void
+osmo_stream_srv_set_data(struct osmo_stream_srv *conn,
+ void *data)
+{
+ conn->data = data;
+}
+
+/*! Set the segmentation callback for target osmo_stream_srv structure.
+ *
+ * A segmentation call-back can optionally be used when a packet based protocol (like TCP) is used within a
+ * STREAM style socket that does not preserve message boundaries within the stream. If a segmentation
+ * call-back is given, the osmo_stream_srv library code will makes sure that the read_cb called only for
+ * complete single messages, and not arbitrary segments of the stream.
+ *
+ * This function only works with osmo_stream_srv in osmo_io mode, created by osmo_stream_srv_create2()!
+ * The connection has to have been established prior to calling this function.
+ *
+ * \param[in,out] conn Target Stream Server to modify
+ * \param[in] segmentation_cb Segmentation callback to be set */
+void osmo_stream_srv_set_segmentation_cb(struct osmo_stream_srv *conn,
+ osmo_stream_srv_segmentation_cb_t segmentation_cb)
+{
+ /* Note that the following implies that iofd != NULL, since
+ * osmo_stream_srv_create2() creates the iofd member, too */
+ OSMO_ASSERT(conn->mode == OSMO_STREAM_MODE_OSMO_IO);
+ /* Copy default settings */
+ struct osmo_io_ops conn_ops;
+ osmo_iofd_get_ioops(conn->iofd, &conn_ops);
+ /* Set segmentation cb for this connection */
+ conn_ops.segmentation_cb = segmentation_cb;
+ osmo_iofd_set_ioops(conn->iofd, &conn_ops);
+}
+
+/*! Retrieve application private data of the stream server
+ * \param[in] conn Stream Server
+ * \returns Application private data, as set by \ref osmo_stream_srv_set_data() */
+void *osmo_stream_srv_get_data(struct osmo_stream_srv *conn)
+{
+ return conn->data;
+}
+
+/*! Retrieve the stream server socket description.
+ * The returned name is stored in a static buffer; it is hence not re-entrant or thread-safe!
+ * \param[in] cli Stream Server to examine
+ * \returns Socket description or NULL in case of error */
+const char *osmo_stream_srv_get_sockname(const struct osmo_stream_srv *conn)
+{
+ static char buf[OSMO_STREAM_MAX_ADDRS * OSMO_SOCK_NAME_MAXLEN];
+
+ osmo_sock_multiaddr_get_name_buf(buf, sizeof(buf),
+ osmo_stream_srv_get_fd(conn), conn->srv->proto);
+
+ return buf;
+}
+
+/*! Retrieve Osmocom File Descriptor of a stream server in osmo_fd mode.
+ * \param[in] conn Stream Server
+ * \returns Pointer to \ref osmo_fd */
+struct osmo_fd *
+osmo_stream_srv_get_ofd(struct osmo_stream_srv *conn)
+{
+ OSMO_ASSERT(conn->mode == OSMO_STREAM_MODE_OSMO_FD);
+ return &conn->ofd;
+}
+
+/*! Retrieve File Descriptor of the stream server
+ * \param[in] conn Stream Server
+ * \returns file descriptor or negative on error */
+int
+osmo_stream_srv_get_fd(const struct osmo_stream_srv *conn)
+{
+ switch (conn->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ return conn->ofd.fd;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ if (conn->iofd)
+ return osmo_iofd_get_fd(conn->iofd);
+ default:
+ break;
+ }
+ return -EINVAL;
+}
+
+/*! Retrieve osmo_io descriptor of the stream server socket.
+ * This function must not be called on a stream server in legacy osmo_fd mode!
+ * \param[in] srv Stream Server of which we want to obtain the osmo_io descriptor
+ * \returns osmo_io_fd of stream server. */
+struct osmo_io_fd *
+osmo_stream_srv_get_iofd(const struct osmo_stream_srv *srv)
+{
+ OSMO_ASSERT(srv->mode == OSMO_STREAM_MODE_OSMO_IO);
+ return srv->iofd;
+}
+
+/*! Retrieve the master (Link) from a Stream Server.
+ * \param[in] conn Stream Server of which we want to know the Link
+ * \returns Link through which the given Stream Server is established */
+struct osmo_stream_srv_link *osmo_stream_srv_get_master(struct osmo_stream_srv *conn)
+{
+ return conn->srv;
+}
+
+/*! Destroy given Stream Server.
+ * This function closes the Stream Server socket, unregisters from the underlying I/O mechanism, invokes the
+ * connection's closed_cb() callback to allow API users to clean up any associated state they have for this
+ * connection, and then de-allocates associated memory.
+ * \param[in] conn Stream Server to be destroyed */
+void osmo_stream_srv_destroy(struct osmo_stream_srv *conn)
+{
+ switch (conn->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ osmo_fd_unregister(&conn->ofd);
+ close(conn->ofd.fd);
+ msgb_queue_free(&conn->tx_queue);
+ conn->ofd.fd = -1;
+ break;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ osmo_iofd_free(conn->iofd);
+ conn->iofd = NULL;
+ break;
+ default:
+ OSMO_ASSERT(false);
+ }
+ if (conn->closed_cb)
+ conn->closed_cb(conn);
+ talloc_free(conn);
+}
+
+/*! Enqueue data to be sent via an Osmocom stream server.
+ * \param[in] conn Stream Server through which we want to send
+ * \param[in] msg Message buffer to enqueue in transmit queue */
+void osmo_stream_srv_send(struct osmo_stream_srv *conn, struct msgb *msg)
+{
+ int rc;
+
+ OSMO_ASSERT(conn);
+ OSMO_ASSERT(msg);
+ if (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY) {
+ LOGSSRV(conn, LOGL_DEBUG, "Connection is being flushed and closed; ignoring new outgoing message\n");
+ msgb_free(msg);
+ return;
+ }
+
+ switch (conn->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ msgb_enqueue(&conn->tx_queue, msg);
+ osmo_fd_write_enable(&conn->ofd);
+ break;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ if (conn->srv->proto == IPPROTO_SCTP)
+ rc = stream_iofd_sctp_send_msgb(conn->iofd, msg, MSG_NOSIGNAL);
+ else
+ rc = osmo_iofd_write_msgb(conn->iofd, msg);
+ if (rc < 0)
+ msgb_free(msg);
+ break;
+ default:
+ OSMO_ASSERT(false);
+ }
+}
+
+/*! Receive data via an Osmocom stream server in osmo_fd mode.
+ * \param[in] conn Stream Server from which to receive
+ * \param msg pre-allocate message buffer to which received data is appended
+ * \returns number of bytes read, negative on error.
+ *
+ * Application programs using the legacy osmo_fd mode of osmo_stream_srv will use
+ * this function to read/receive from a stream socket after they have been notified that
+ * it is readable (via select/poll).
+ *
+ * If conn is an SCTP connection, additional specific considerations shall be taken:
+ * - msg->cb is always filled with SCTP ppid, and SCTP stream values, see msgb_sctp_*() APIs.
+ * - If an SCTP notification was received when reading from the SCTP socket,
+ * msgb_sctp_msg_flags(msg) will contain bit flag
+ * OSMO_STREAM_SCTP_MSG_FLAGS_NOTIFICATION set, and the msgb will
+ * contain a "union sctp_notification" instead of user data. In this case the
+ * return code will be either 0 (if conn is considered dead after the
+ * notification) or -EAGAIN (if conn is considered still alive after the
+ * notification) resembling the standard recv() API.
+ */
+int osmo_stream_srv_recv(struct osmo_stream_srv *conn, struct msgb *msg)
+{
+ int ret;
+ OSMO_ASSERT(conn);
+ OSMO_ASSERT(msg);
+ OSMO_ASSERT(conn->mode == OSMO_STREAM_MODE_OSMO_FD);
+
+ switch (conn->srv->sk_domain) {
+ case AF_UNIX:
+ ret = recv(conn->ofd.fd, msg->tail, msgb_tailroom(msg), 0);
+ break;
+ case AF_INET:
+ case AF_INET6:
+ case AF_UNSPEC:
+ switch (conn->srv->proto) {
+#ifdef HAVE_LIBSCTP
+ case IPPROTO_SCTP:
+ {
+ char log_pfx[128];
+ snprintf(log_pfx, sizeof(log_pfx), "SRV(%s,%s)", conn->name ? : "", conn->sockname);
+ ret = stream_sctp_recvmsg_wrapper(conn->ofd.fd, msg, log_pfx);
+ break;
+ }
+#endif
+ case IPPROTO_TCP:
+ default:
+ ret = recv(conn->ofd.fd, msg->tail, msgb_tailroom(msg), 0);
+ break;
+ }
+ break;
+ default:
+ ret = -ENOTSUP;
+ }
+
+ if (ret < 0) {
+ if (errno == EPIPE || errno == ECONNRESET)
+ LOGSSRV(conn, LOGL_ERROR, "lost connection with client\n");
+ return ret;
+ } else if (ret == 0) {
+ LOGSSRV(conn, LOGL_ERROR, "connection closed with client\n");
+ return ret;
+ }
+ msgb_put(msg, ret);
+ LOGSSRV(conn, LOGL_DEBUG, "received %d bytes from client\n", ret);
+ return ret;
+}
+
+void osmo_stream_srv_clear_tx_queue(struct osmo_stream_srv *conn)
+{
+ switch (conn->mode) {
+ case OSMO_STREAM_MODE_OSMO_FD:
+ msgb_queue_free(&conn->tx_queue);
+ osmo_fd_write_disable(&conn->ofd);
+ break;
+ case OSMO_STREAM_MODE_OSMO_IO:
+ osmo_iofd_txqueue_clear(conn->iofd);
+ break;
+ case OSMO_STREAM_MODE_UNKNOWN:
+ default:
+ break;
+ }
+
+ if (conn->flags & OSMO_STREAM_SRV_F_FLUSH_DESTROY)
+ osmo_stream_srv_destroy(conn);
+}
+
+/*! @} */
diff --git a/tests/Makefile.am b/tests/Makefile.am
index dd7703a..cc33960 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1,23 +1,29 @@
-AM_CFLAGS = -Wall -I$(top_srcdir)/include $(LIBOSMOCORE_CFLAGS) -g
-AM_LDFLAGS = $(LIBOSMOCORE_LDFLAGS) -no-install
+AM_CPPFLAGS = -I$(top_srcdir)/include
+AM_CFLAGS = -Wall $(LIBOSMOCORE_CFLAGS) -g
+AM_LDFLAGS = -no-install
-check_PROGRAMS = osmux/osmux_test osmux/osmux_test2 stream/stream_test jibuf/jibuf_test amr/amr_test
+LDADD = \
+ $(top_builddir)/src/libosmonetif.la \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOGSM_LIBS) \
+ $(NULL)
+
+check_PROGRAMS = \
+ osmux/osmux_test \
+ osmux/osmux_output_test \
+ osmux/osmux_input_test \
+ stream/stream_test \
+ jibuf/jibuf_test \
+ amr/amr_test \
+ $(NULL)
check_HEADERS =
osmux_osmux_test_SOURCES = osmux/osmux_test.c
-osmux_osmux_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la
-
-osmux_osmux_test2_SOURCES = osmux/osmux_test2.c
-osmux_osmux_test2_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la
-
+osmux_osmux_output_test_SOURCES = osmux/osmux_output_test.c
+osmux_osmux_input_test_SOURCES = osmux/osmux_input_test.c
stream_stream_test_SOURCES = stream/stream_test.c
-stream_stream_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la
-
jibuf_jibuf_test_SOURCES = jibuf/jibuf_test.c
-jibuf_jibuf_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la
-
amr_amr_test_SOURCES = amr/amr_test.c
-amr_amr_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(top_builddir)/src/libosmonetif.la
if HAVE_PCAP
check_PROGRAMS += jibuf/jibuf_tool
@@ -35,11 +41,7 @@ jibuf_jibuf_tool_SOURCES = \
osmo-pcap-test/l4_udp.c \
osmo-pcap-test/pcap.c
-jibuf_jibuf_tool_LDADD = \
- $(LIBOSMOCORE_LIBS) \
- $(LIBOSMOGSM_LIBS) \
- $(top_builddir)/src/libosmonetif.la \
- -lpcap
+jibuf_jibuf_tool_LDADD = $(LDADD) -lpcap
endif
# The `:;' works around a Bash 3.2 bug when the output is not writeable.
@@ -62,7 +64,8 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac
EXTRA_DIST = testsuite.at $(srcdir)/package.m4 $(TESTSUITE) \
osmux/osmux_test.ok \
- osmux/osmux_test2.ok \
+ osmux/osmux_output_test.ok \
+ osmux/osmux_input_test.ok \
stream/stream_test.ok \
stream/stream_test.err \
jibuf/jibuf_test.ok \
diff --git a/tests/amr/amr_test.c b/tests/amr/amr_test.c
index fabf948..bc18554 100644
--- a/tests/amr/amr_test.c
+++ b/tests/amr/amr_test.c
@@ -29,6 +29,7 @@ char *oa_amr_samples[] = {
"703c22f979890338540179209572624a0f8535871c2f7039cbf926b7e4425b6ef0",
"703c2e671f3b1b0810412d5adae61e2b2a319885c6ced4e909b4eeaa2ea0f0cd80",
"703cf8fc77356c948141686cda34d35220db719e36a359d86b64420dc64b563850",
+ "703c3eec9c37dfb201c093c57a1235a02af55ccc22f1c9593a6e058c368b4d7f50",
"60344e300c0e6251342c2ae51fd8a698a945488d16c98922726f3e50",
"60341fc722c7880328a9c280030bc9755c3ef519f80000295323e000",
"60342c338655c00008efba03592419adf62478a79278b3e2d68ab0f0",
@@ -47,7 +48,8 @@ char *oa_amr_samples[] = {
"0004f89d67f1160935bde1996840",
"0004633cc7f0630439ffe0000000",
"0004eb81fc0758973b9edc782550",
- "a078ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc", /* sample with invalid FT */
+ "a070ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc", /* sample with invalid FT=14, will be detected as bandwith-efficient */
+ "a078", /* sample with FT=15 NO_DATA */
"END",
};
@@ -55,14 +57,34 @@ char *oa_amr_samples[] = {
char *bwe_amr_samples[] = {
"f4495c7cda8f80",
"f44aaa6c969780",
+ "7449c1e32c6780",
+ "74400000000380",
+ "703c493323b0bf68028086d15a00",
+ "703c59171697c53c01801fb6aa80",
+ "703c55029bb2e23a0020172e8b00",
+ "703c48f52442f08884a8050b8500",
+ "7038000000000000000000000000",
+ "7151434e01292c40c4735e4412204077",
+ "714eadbe13ac4694f4726f71985d64cd",
"f3d09c20e32da600c025a72e0a9b360386e40f87e19282094adc1a11e397d1d4",
"f3d39a49a09e7a802852e297e8c9246aadf5a45928bfc27177fed8404d97d3b8",
"f3c2155b65131c68682079fab4810911200003b360ae0446000025f11e539dd0",
"f3c381bc7061c9f8507f6029de6115c16e5fa470c243b21b6e35dbb48bd84c00",
+ "73c901b7a2004be7f85284b6ab7142acfe6872b1ae1c107d0588b551de7be650",
"a7bfc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03f", /* sample with invalid FT */
+ "4780", /* FT=15 NO_DATA */
"END",
};
+/* Some IuUP payload containg AMR */
+char *iuup_amr_samples[] = {
+ "7a687b8b29ba02013d3cb863a5af4206869618fb5336d504968d7541663210",
+ "4482803977dc1880b56aab097728a6bbbb48a57e3affe41125838a5ce65fc0",
+ "2683c1d26e",
+ "END",
+};
+
+
void dump_bits(uint8_t *buf, int len)
{
unsigned int i;
@@ -185,6 +207,56 @@ void osmo_amr_oa_to_bwe_and_inverse_test(void)
}
}
+void osmo_amr_iuup_to_bwe_and_inverse_test(void)
+{
+ uint8_t buf[256];
+ uint8_t buf_chk[256];
+ int ft;
+
+ unsigned int i = 0;
+ int len;
+ int rc;
+
+ printf("\n\n");
+ printf
+ ("Testing conversion from IuUP to bw-efficient and inverse:\n");
+
+ while (1) {
+ if (strcmp(iuup_amr_samples[i], "END") == 0)
+ return;
+ printf("Sample No.: %d...", i);
+
+ len = osmo_hexparse(iuup_amr_samples[i], buf, sizeof(buf));
+ OSMO_ASSERT(len > 0);
+ i++;
+
+ ft = osmo_amr_bytes_to_ft(len);
+ if (ft < 0) {
+ printf(" skipping a sample with a wrong FT\n");
+ continue;
+ }
+ printf(" AMR mode: %d, IuUP: %d bytes,", ft, len);
+ memcpy(buf_chk, buf, sizeof(buf));
+
+ rc = osmo_amr_iuup_to_bwe(buf, len, sizeof(buf));
+ OSMO_ASSERT(rc > 0);
+ OSMO_ASSERT((rc == len + 1) || (rc == len + 2));
+ printf(" BE: %d bytes (%s),", rc, osmo_hexdump(buf, rc));
+
+ buf[0] = (ft >> 1) & 0x07;
+ buf[1] = ((ft & 0x01) << 7) | (buf[1] & 0x3f);
+ rc = osmo_amr_bwe_to_iuup(buf, rc);
+ printf(" IuUP: %d bytes\n", rc);
+ OSMO_ASSERT(rc > 0);
+ OSMO_ASSERT(len == rc);
+ if (memcmp(buf, buf_chk, len) != 0) {
+ printf("Got: %s\n", osmo_hexdump(buf, len));
+ printf("Expected:%s\n", osmo_hexdump(buf_chk, len));
+ }
+ OSMO_ASSERT(memcmp(buf, buf_chk, len) == 0);
+ }
+}
+
void osmo_amr_is_oa_test(void)
{
uint8_t buf[256];
@@ -239,6 +311,7 @@ int main(int argc, char **argv)
osmo_amr_oa_to_bwe_test();
osmo_amr_bwe_to_oa_test();
osmo_amr_oa_to_bwe_and_inverse_test();
+ osmo_amr_iuup_to_bwe_and_inverse_test();
osmo_amr_is_oa_test();
fprintf(stdout, "OK: Test passed\n");
diff --git a/tests/amr/amr_test.ok b/tests/amr/amr_test.ok
index eea513b..24cbd6a 100644
--- a/tests/amr/amr_test.ok
+++ b/tests/amr/amr_test.ok
@@ -24,138 +24,152 @@ Sample No.: 2
rc: 32
Sample No.: 3
+ octet aligned: 703c3eec9c37dfb201c093c57a1235a02af55ccc22f1c9593a6e058c368b4d7f50
+ 011100000011110000111110111011001001110000110111110111111011001000000001110000001001001111000101011110100001001000110101101000000010101011110101010111001100110000100010111100011100100101011001001110100110111000000101100011000011011010001011010011010111111101010000
+ bw-efficient: 73cfbb270df7ec807024f15e848d680abd573308bc72564e9b81630da2d35fd4
+ 0111001111001111101110110010011100001101111101111110110010000000011100000010010011110001010111101000010010001101011010000000101010111101010101110011001100001000101111000111001001010110010011101001101110000001011000110000110110100010110100110101111111010100
+ rc: 32
+
+Sample No.: 4
octet aligned: 60344e300c0e6251342c2ae51fd8a698a945488d16c98922726f3e50
01100000001101000100111000110000000011000000111001100010010100010011010000101100001010101110010100011111110110001010011010011000101010010100010101001000100011010001011011001001100010010010001001110010011011110011111001010000
bw-efficient: 63538c030398944d0b0ab947f629a62a51522345b262489c9bcf94
011000110101001110001100000000110000001110011000100101000100110100001011000010101011100101000111111101100010100110100110001010100101000101010010001000110100010110110010011000100100100010011100100110111100111110010100
rc: 27
-Sample No.: 4
+Sample No.: 5
octet aligned: 60341fc722c7880328a9c280030bc9755c3ef519f80000295323e000
01100000001101000001111111000111001000101100011110001000000000110010100010101001110000101000000000000011000010111100100101110101010111000011111011110101000110011111100000000000000000000010100101010011001000111110000000000000
bw-efficient: 6347f1c8b1e200ca2a70a000c2f25d570fbd467e00000a54c8f800
011000110100011111110001110010001011000111100010000000001100101000101010011100001010000000000000110000101111001001011101010101110000111110111101010001100111111000000000000000000000101001010100110010001111100000000000
rc: 27
-Sample No.: 5
+Sample No.: 6
octet aligned: 60342c338655c00008efba03592419adf62478a79278b3e2d68ab0f0
01100000001101000010110000110011100001100101010111000000000000000000100011101111101110100000001101011001001001000001100110101101111101100010010001111000101001111001001001111000101100111110001011010110100010101011000011110000
bw-efficient: 634b0ce1957000023bee80d649066b7d891e29e49e2cf8b5a2ac3c
011000110100101100001100111000011001010101110000000000000000001000111011111011101000000011010110010010010000011001101011011111011000100100011110001010011110010010011110001011001111100010110101101000101010110000111100
rc: 27
-Sample No.: 6
+Sample No.: 7
octet aligned: 502c98ab841e491ff7a1a555016a32a3c7f913210630
01010000001011001001100010101011100001000001111001001001000111111111011110100001101001010101010100000001011010100011001010100011110001111111100100010011001000010000011000110000
bw-efficient: 52e62ae1079247fde86955405a8ca8f1fe44c8418c00
01010010111001100010101011100001000001111001001001000111111111011110100001101001010101010100000001011010100011001010100011110001111111100100010011001000010000011000110000000000
rc: 22
-Sample No.: 7
+Sample No.: 8
octet aligned: 502cc5459a0d200e7097c4dfe86ec8d27f1756d776f0
01010000001011001100010101000101100110100000110100100000000011100111000010010111110001001101111111101000011011101100100011010010011111110001011101010110110101110111011011110000
bw-efficient: 52f151668348039c25f137fa1bb2349fc5d5b5ddbc00
01010010111100010101000101100110100000110100100000000011100111000010010111110001001101111111101000011011101100100011010010011111110001011101010110110101110111011011110000000000
rc: 22
-Sample No.: 8
+Sample No.: 9
octet aligned: 502c42b332081813d7e916e7aa5e80d7fde812b8c080
01010000001011000100001010110011001100100000100000011000000100111101011111101001000101101110011110101010010111101000000011010111111111011110100000010010101110001100000010000000
bw-efficient: 52d0accc820604f5fa45b9ea97a035ff7a04ae302000
01010010110100001010110011001100100000100000011000000100111101011111101001000101101110011110101010010111101000000011010111111111011110100000010010101110001100000010000000000000
rc: 22
-Sample No.: 9
+Sample No.: 10
octet aligned: 40240343e959c79bacd20c77501054880a718db200
010000000010010000000011010000111110100101011001110001111001101110101100110100100000110001110111010100000001000001010100100010000000101001110001100011011011001000000000
bw-efficient: 4240d0fa5671e6eb34831dd4041522029c636c80
0100001001000000110100001111101001010110011100011110011011101011001101001000001100011101110101000000010000010101001000100000001010011100011000110110110010000000
rc: 20
-Sample No.: 10
+Sample No.: 11
octet aligned: 4024172c53401e39115ceecd12606df5689bdd0ca0
010000000010010000010111001011000101001101000000000111100011100100010001010111001110111011001101000100100110000001101101111101010110100010011011110111010000110010100000
bw-efficient: 4245cb14d0078e44573bb344981b7d5a26f74328
0100001001000101110010110001010011010000000001111000111001000100010101110011101110110011010001001001100000011011011111010101101000100110111101110100001100101000
rc: 20
-Sample No.: 11
+Sample No.: 12
octet aligned: 4024f871cf48801ec427f0fc3f7318898622062200
010000000010010011111000011100011100111101001000100000000001111011000100001001111111000011111100001111110111001100011000100010011000011000100010000001100010001000000000
bw-efficient: 427e1c73d22007b109fc3f0fdcc6226188818880
0100001001111110000111000111001111010010001000000000011110110001000010011111110000111111000011111101110011000110001000100110000110001000100000011000100010000000
rc: 20
-Sample No.: 12
+Sample No.: 13
octet aligned: 20141fd4c02667c742b164aef659ffe708
0010000000010100000111111101010011000000001001100110011111000111010000101011000101100100101011101111011001011001111111111110011100001000
bw-efficient: 2147f5300999f1d0ac592bbd967ff9c2
00100001010001111111010100110000000010011001100111110001110100001010110001011001001010111011110110010110011111111111100111000010
rc: 16
-Sample No.: 13
+Sample No.: 14
octet aligned: 2014197e10ead7b250bccbbf3b81887c64
0010000000010100000110010111111000010000111010101101011110110010010100001011110011001011101111110011101110000001100010000111110001100100
bw-efficient: 21465f843ab5ec942f32efcee0621f19
00100001010001100101111110000100001110101011010111101100100101000010111100110010111011111100111011100000011000100001111100011001
rc: 16
-Sample No.: 14
+Sample No.: 15
octet aligned: 2014e959f35fdfe5e9667ffbc088818088
0010000000010100111010010101100111110011010111111101111111100101111010010110011001111111111110111100000010001000100000011000000010001000
bw-efficient: 217a567cd7f7f97a599ffef022206022
00100001011110100101011001111100110101111111011111111001011110100101100110011111111111101111000000100010001000000110000000100010
rc: 16
-Sample No.: 15
+Sample No.: 16
octet aligned: 100c4e9ba850e30d5d53d04de41e7c
000100000000110001001110100110111010100001010000111000110000110101011101010100111101000001001101111001000001111001111100
bw-efficient: 10d3a6ea1438c35754f41379079f00
000100001101001110100110111010100001010000111000110000110101011101010100111101000001001101111001000001111001111100000000
rc: 15
-Sample No.: 16
+Sample No.: 17
octet aligned: 100c6c18e7b7fff53aeb055e7d1c54
000100000000110001101100000110001110011110110111111111111111010100111010111010110000010101011110011111010001110001010100
bw-efficient: 10db0639edfffd4ebac1579f471500
000100001101101100000110001110011110110111111111111111010100111010111010110000010101011110011111010001110001010100000000
rc: 15
-Sample No.: 17
+Sample No.: 18
octet aligned: 100c1fb967f7f1fdf547bf2e61c060
000100000000110000011111101110010110011111110111111100011111110111110101010001111011111100101110011000011100000001100000
bw-efficient: 10c7ee59fdfc7f7d51efcb98701800
000100001100011111101110010110011111110111111100011111110111110101010001111011111100101110011000011100000001100000000000
rc: 15
-Sample No.: 18
+Sample No.: 19
octet aligned: 0004f89d67f1160935bde1996840
0000000000000100111110001001110101100111111100010001011000001001001101011011110111100001100110010110100001000000
bw-efficient: 007e2759fc45824d6f78665a1000
0000000001111110001001110101100111111100010001011000001001001101011011110111100001100110010110100001000000000000
rc: 14
-Sample No.: 19
+Sample No.: 20
octet aligned: 0004633cc7f0630439ffe0000000
0000000000000100011000110011110011000111111100000110001100000100001110011111111111100000000000000000000000000000
bw-efficient: 0058cf31fc18c10e7ff800000000
0000000001011000110011110011000111111100000110001100000100001110011111111111100000000000000000000000000000000000
rc: 14
-Sample No.: 20
+Sample No.: 21
octet aligned: 0004eb81fc0758973b9edc782550
0000000000000100111010111000000111111100000001110101100010010111001110111001111011011100011110000010010101010000
bw-efficient: 007ae07f01d625cee7b71e095400
0000000001111010111000000111111100000001110101100010010111001110111001111011011100011110000010010101010000000000
rc: 14
-Sample No.: 21
- octet aligned: a078ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc
- 101000000111100011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111100
+Sample No.: 22
+ octet aligned: a070ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00ff00fc
+ 101000000111000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111100
bw-efficient:
(no data)
rc: -1
+Sample No.: 23
+ octet aligned: a078
+ 1010000001111000
+ bw-efficient: a780
+ 1010011110000000
+ rc: 2
+
Testing conversion from bw-efficient to octet-aligned:
@@ -174,64 +188,149 @@ Sample No.: 1
rc: 7
Sample No.: 2
+ bw-efficient: 7449c1e32c6780
+ 01110100010010011100000111100011001011000110011110000000
+ octet aligned: 704427078cb19c
+ 01110000010001000010011100000111100011001011000110011100
+ rc: 7
+
+Sample No.: 3
+ bw-efficient: 74400000000380
+ 01110100010000000000000000000000000000000000001110000000
+ octet aligned: 7044000000000c
+ 01110000010001000000000000000000000000000000000000001100
+ rc: 7
+
+Sample No.: 4
+ bw-efficient: 703c493323b0bf68028086d15a00
+ 0111000000111100010010010011001100100011101100001011111101101000000000101000000010000110110100010101101000000000
+ octet aligned: 7000f124cc8ec2fda00a021b4568
+ 0111000000000000111100010010010011001100100011101100001011111101101000000000101000000010000110110100010101101000
+ rc: 14
+
+Sample No.: 5
+ bw-efficient: 703c59171697c53c01801fb6aa80
+ 0111000000111100010110010001011100010110100101111100010100111100000000011000000000011111101101101010101010000000
+ octet aligned: 7000f1645c5a5f14f006007edaa8
+ 0111000000000000111100010110010001011100010110100101111100010100111100000000011000000000011111101101101010101000
+ rc: 14
+
+Sample No.: 6
+ bw-efficient: 703c55029bb2e23a0020172e8b00
+ 0111000000111100010101010000001010011011101100101110001000111010000000000010000000010111001011101000101100000000
+ octet aligned: 7000f1540a6ecb88e800805cba2c
+ 0111000000000000111100010101010000001010011011101100101110001000111010000000000010000000010111001011101000101100
+ rc: 14
+
+Sample No.: 7
+ bw-efficient: 703c48f52442f08884a8050b8500
+ 0111000000111100010010001111010100100100010000101111000010001000100001001010100000000101000010111000010100000000
+ octet aligned: 7000f123d4910bc22212a0142e14
+ 0111000000000000111100010010001111010100100100010000101111000010001000100001001010100000000101000010111000010100
+ rc: 14
+
+Sample No.: 8
+ bw-efficient: 7038000000000000000000000000
+ 0111000000111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ octet aligned: 7000e00000000000000000000000
+ 0111000000000000111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
+ rc: 14
+
+Sample No.: 9
+ bw-efficient: 7151434e01292c40c4735e4412204077
+ 01110001010100010100001101001110000000010010100100101100010000001100010001110011010111100100010000010010001000000100000001110111
+ octet aligned: 7014450d3804a4b10311cd7910488101dc
+ 0111000000010100010001010000110100111000000001001010010010110001000000110001000111001101011110010001000001001000100000010000000111011100
+ rc: 17
+
+Sample No.: 10
+ bw-efficient: 714eadbe13ac4694f4726f71985d64cd
+ 01110001010011101010110110111110000100111010110001000110100101001111010001110010011011110111000110011000010111010110010011001101
+ octet aligned: 70143ab6f84eb11a53d1c9bdc661759334
+ 0111000000010100001110101011011011111000010011101011000100011010010100111101000111001001101111011100011001100001011101011001001100110100
+ rc: 17
+
+Sample No.: 11
bw-efficient: f3d09c20e32da600c025a72e0a9b360386e40f87e19282094adc1a11e397d1d4
1111001111010000100111000010000011100011001011011010011000000000110000000010010110100111001011100000101010011011001101100000001110000110111001000000111110000111111000011001001010000010000010010100101011011100000110100001000111100011100101111101000111010100
octet aligned: f03c4270838cb6980300969cb82a6cd80e1b903e1f864a08252b7068478e5f4750
111100000011110001000010011100001000001110001100101101101001100000000011000000001001011010011100101110000010101001101100110110000000111000011011100100000011111000011111100001100100101000001000001001010010101101110000011010000100011110001110010111110100011101010000
rc: 33
-Sample No.: 3
+Sample No.: 12
bw-efficient: f3d39a49a09e7a802852e297e8c9246aadf5a45928bfc27177fed8404d97d3b8
1111001111010011100110100100100110100000100111100111101010000000001010000101001011100010100101111110100011001001001001000110101010101101111101011010010001011001001010001011111111000010011100010111011111111110110110000100000001001101100101111101001110111000
octet aligned: f03c4e69268279ea00a14b8a5fa32491aab7d69164a2ff09c5dffb6101365f4ee0
111100000011110001001110011010010010011010000010011110011110101000000000101000010100101110001010010111111010001100100100100100011010101010110111110101101001000101100100101000101111111100001001110001011101111111111011011000010000000100110110010111110100111011100000
rc: 33
-Sample No.: 4
+Sample No.: 13
bw-efficient: f3c2155b65131c68682079fab4810911200003b360ae0446000025f11e539dd0
1111001111000010000101010101101101100101000100110001110001101000011010000010000001111001111110101011010010000001000010010001000100100000000000000000001110110011011000001010111000000100010001100000000000000000001001011111000100011110010100111001110111010000
octet aligned: f03c08556d944c71a1a081e7ead204244480000ecd82b81118000097c4794e7740
111100000011110000001000010101010110110110010100010011000111000110100001101000001000000111100111111010101101001000000100001001000100010010000000000000000000111011001101100000101011100000010001000110000000000000000000100101111100010001111001010011100111011101000000
rc: 33
-Sample No.: 5
+Sample No.: 14
bw-efficient: f3c381bc7061c9f8507f6029de6115c16e5fa470c243b21b6e35dbb48bd84c00
1111001111000011100000011011110001110000011000011100100111111000010100000111111101100000001010011101111001100001000101011100000101101110010111111010010001110000110000100100001110110010000110110110111000110101110110111011010010001011110110000100110000000000
octet aligned: f03c0e06f1c18727e141fd80a779845705b97e91c3090ec86db8d76ed22f613000
111100000011110000001110000001101111000111000001100001110010011111100001010000011111110110000000101001110111100110000100010101110000010110111001011111101001000111000011000010010000111011001000011011011011100011010111011011101101001000101111011000010011000000000000
rc: 33
-Sample No.: 6
+Sample No.: 15
+ bw-efficient: 73c901b7a2004be7f85284b6ab7142acfe6872b1ae1c107d0588b551de7be650
+ 0111001111001001000000011011011110100010000000000100101111100111111110000101001010000100101101101010101101110001010000101010110011111110011010000111001010110001101011100001110000010000011111010000010110001000101101010101000111011110011110111110011001010000
+ octet aligned: 703c2406de88012f9fe14a12daadc50ab3f9a1cac6b87041f41622d54779ef9940
+ 011100000011110000100100000001101101111010001000000000010010111110011111111000010100101000010010110110101010110111000101000010101011001111111001101000011100101011000110101110000111000001000001111101000001011000100010110101010100011101111001111011111001100101000000
+ rc: 33
+
+Sample No.: 16
bw-efficient: a7bfc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03fc03f
1010011110111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111110000000011111111000000001111111100000000111111
- octet aligned:
- (no data)
- rc: -1
+ octet aligned: a078
+ 1010000001111000
+ rc: 2
+
+Sample No.: 17
+ bw-efficient: 4780
+ 0100011110000000
+ octet aligned: 4078
+ 0100000001111000
+ rc: 2
Testing conversion from octet-aligned to bw-efficient and inverse:
Sample No.: 0... AMR mode: 7, OA: 33 bytes, BE: 32 bytes, OA: 33 bytes
Sample No.: 1... AMR mode: 7, OA: 33 bytes, BE: 32 bytes, OA: 33 bytes
Sample No.: 2... AMR mode: 7, OA: 33 bytes, BE: 32 bytes, OA: 33 bytes
-Sample No.: 3... AMR mode: 6, OA: 28 bytes, BE: 27 bytes, OA: 28 bytes
+Sample No.: 3... AMR mode: 7, OA: 33 bytes, BE: 32 bytes, OA: 33 bytes
Sample No.: 4... AMR mode: 6, OA: 28 bytes, BE: 27 bytes, OA: 28 bytes
Sample No.: 5... AMR mode: 6, OA: 28 bytes, BE: 27 bytes, OA: 28 bytes
-Sample No.: 6... AMR mode: 5, OA: 22 bytes, BE: 22 bytes, OA: 22 bytes
+Sample No.: 6... AMR mode: 6, OA: 28 bytes, BE: 27 bytes, OA: 28 bytes
Sample No.: 7... AMR mode: 5, OA: 22 bytes, BE: 22 bytes, OA: 22 bytes
Sample No.: 8... AMR mode: 5, OA: 22 bytes, BE: 22 bytes, OA: 22 bytes
-Sample No.: 9... AMR mode: 4, OA: 21 bytes, BE: 20 bytes, OA: 21 bytes
+Sample No.: 9... AMR mode: 5, OA: 22 bytes, BE: 22 bytes, OA: 22 bytes
Sample No.: 10... AMR mode: 4, OA: 21 bytes, BE: 20 bytes, OA: 21 bytes
Sample No.: 11... AMR mode: 4, OA: 21 bytes, BE: 20 bytes, OA: 21 bytes
-Sample No.: 12... AMR mode: 2, OA: 17 bytes, BE: 16 bytes, OA: 17 bytes
+Sample No.: 12... AMR mode: 4, OA: 21 bytes, BE: 20 bytes, OA: 21 bytes
Sample No.: 13... AMR mode: 2, OA: 17 bytes, BE: 16 bytes, OA: 17 bytes
Sample No.: 14... AMR mode: 2, OA: 17 bytes, BE: 16 bytes, OA: 17 bytes
-Sample No.: 15... AMR mode: 1, OA: 15 bytes, BE: 15 bytes, OA: 15 bytes
+Sample No.: 15... AMR mode: 2, OA: 17 bytes, BE: 16 bytes, OA: 17 bytes
Sample No.: 16... AMR mode: 1, OA: 15 bytes, BE: 15 bytes, OA: 15 bytes
Sample No.: 17... AMR mode: 1, OA: 15 bytes, BE: 15 bytes, OA: 15 bytes
-Sample No.: 18... AMR mode: 0, OA: 14 bytes, BE: 14 bytes, OA: 14 bytes
+Sample No.: 18... AMR mode: 1, OA: 15 bytes, BE: 15 bytes, OA: 15 bytes
Sample No.: 19... AMR mode: 0, OA: 14 bytes, BE: 14 bytes, OA: 14 bytes
Sample No.: 20... AMR mode: 0, OA: 14 bytes, BE: 14 bytes, OA: 14 bytes
-Sample No.: 21... skipping a sample with a wrong FT
+Sample No.: 21... AMR mode: 0, OA: 14 bytes, BE: 14 bytes, OA: 14 bytes
+Sample No.: 22... skipping a sample with a wrong FT
+Sample No.: 23... AMR mode: 15, OA: 2 bytes, BE: 2 bytes, OA: 2 bytes
+
+
+Testing conversion from IuUP to bw-efficient and inverse:
+Sample No.: 0... AMR mode: 7, IuUP: 31 bytes, BE: 32 bytes (00 1e 9a 1e e2 ca 6e 80 80 4f 4f 2e 18 e9 6b d0 81 a1 a5 86 3e d4 cd b5 41 25 a3 5d 50 59 8c 84 ), IuUP: 31 bytes
+Sample No.: 1... AMR mode: 7, IuUP: 31 bytes, BE: 32 bytes (00 11 20 a0 0e 5d f7 06 20 2d 5a aa c2 5d ca 29 ae ee d2 29 5f 8e bf f9 04 49 60 e2 97 39 97 f0 ), IuUP: 31 bytes
+Sample No.: 2... AMR mode: 8, IuUP: 5 bytes, BE: 7 bytes (00 09 a0 f0 74 9b 80 ), IuUP: 5 bytes
Testing detection of octet-aligned mode payloads:
@@ -256,7 +355,9 @@ Sample No.: 17 ==>octet aligned
Sample No.: 18 ==>octet aligned
Sample No.: 19 ==>octet aligned
Sample No.: 20 ==>octet aligned
-Sample No.: 21 ==>bandwith efficient
+Sample No.: 21 ==>octet aligned
+Sample No.: 22 ==>bandwith efficient
+Sample No.: 23 ==>octet aligned
Sample No.: 0 ==>bandwith efficient
Sample No.: 1 ==>bandwith efficient
Sample No.: 2 ==>bandwith efficient
@@ -264,4 +365,15 @@ Sample No.: 3 ==>bandwith efficient
Sample No.: 4 ==>bandwith efficient
Sample No.: 5 ==>bandwith efficient
Sample No.: 6 ==>bandwith efficient
+Sample No.: 7 ==>bandwith efficient
+Sample No.: 8 ==>bandwith efficient
+Sample No.: 9 ==>bandwith efficient
+Sample No.: 10 ==>bandwith efficient
+Sample No.: 11 ==>bandwith efficient
+Sample No.: 12 ==>bandwith efficient
+Sample No.: 13 ==>bandwith efficient
+Sample No.: 14 ==>bandwith efficient
+Sample No.: 15 ==>bandwith efficient
+Sample No.: 16 ==>bandwith efficient
+Sample No.: 17 ==>bandwith efficient
OK: Test passed
diff --git a/tests/jibuf/jibuf_test.c b/tests/jibuf/jibuf_test.c
index ba1bb01..7643797 100644
--- a/tests/jibuf/jibuf_test.c
+++ b/tests/jibuf/jibuf_test.c
@@ -622,7 +622,7 @@ static void test_rtp_marker(void)
/* This test aims at testing scenarios described in OS#3262, in which syncpoint
packets can provoke a situation in which packets are stored out-of-order in
the queue. */
-static void test_rtp_marker_queue_order()
+static void test_rtp_marker_queue_order(void)
{
int min_delay = 60;
struct msgb *msg;
@@ -797,7 +797,7 @@ int main(int argc, char **argv)
void *tall_ctx = talloc_named_const(NULL, 1, "Root context");
msgb_talloc_ctx_init(tall_ctx, 0);
osmo_init_logging2(tall_ctx, &jibuf_test_log_info);
- log_set_print_filename(osmo_stderr_target, 0);
+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
log_set_category_filter(osmo_stderr_target, DLJIBUF, 1, LOGL_DEBUG);
diff --git a/tests/jibuf/jibuf_tool.c b/tests/jibuf/jibuf_tool.c
index df11131..0502a98 100644
--- a/tests/jibuf/jibuf_tool.c
+++ b/tests/jibuf/jibuf_tool.c
@@ -113,7 +113,7 @@ static uint32_t packets_too_much_jitter;
/* Used for test pcap: */
static struct osmo_pcap osmo_pcap;
static bool pcap_finished;
-static struct osmux_out_handle pcap_osmux_h;
+static struct osmux_out_handle *pcap_osmux_h;
/* ----------------------------- */
static void sigalarm_handler(int foo)
@@ -336,7 +336,7 @@ struct rtp_pkt_info * msgb_allocate_pinfo(struct msgb *msg)
return cb->data;
}
-void rand_send_rtp_packet()
+void rand_send_rtp_packet(void)
{
struct rtp_pkt_info *pinfo;
@@ -438,7 +438,7 @@ int pcap_read_osmux(struct msgb *msg)
/* This code below belongs to the osmux receiver */
while((osmuxh = osmux_xfrm_output_pull(msg)) != NULL)
- osmux_xfrm_output_sched(&pcap_osmux_h, osmuxh);
+ osmux_xfrm_output_sched(pcap_osmux_h, osmuxh);
msgb_free(msg);
return 0;
}
@@ -458,7 +458,7 @@ void pcap_pkt_timer_cb(void *data)
}
}
-void rand_test_check()
+void rand_test_check(void)
{
uint32_t drop_threshold = NUM_PACKETS_TO_SEND * 5 / 100;
if (packets_dropped > drop_threshold) {
@@ -475,7 +475,7 @@ void rand_test_check()
}
}
-void rand_test()
+void rand_test(void)
{
srandom(time(NULL));
rtp_first_seq = (uint16_t) random();
@@ -503,11 +503,11 @@ void rand_test()
rand_test_check();
}
-void pcap_test_check() {
+void pcap_test_check(void) {
}
-void pcap_test() {
+void pcap_test(void) {
osmo_pcap_init();
osmo_pcap.h = osmo_pcap_test_open(opt_pcap_file);
@@ -517,8 +517,10 @@ void pcap_test() {
osmo_pcap.timer.cb = pcap_pkt_timer_cb;
if(opt_osmux) {
- osmux_xfrm_output_init2(&pcap_osmux_h, 0, 98);
- osmux_xfrm_output_set_tx_cb(&pcap_osmux_h, glue_cb, NULL);
+ pcap_osmux_h = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(pcap_osmux_h, 0);
+ osmux_xfrm_output_set_rtp_pl_type(pcap_osmux_h, 98);
+ osmux_xfrm_output_set_tx_cb(pcap_osmux_h, glue_cb, NULL);
}
jb = osmo_jibuf_alloc(NULL);
@@ -532,11 +534,12 @@ void pcap_test() {
while(!pcap_finished || !osmo_jibuf_empty(jb)) {
if (pcap_finished && opt_osmux) /* Flushing once should be enough */
- osmux_xfrm_output_flush(&pcap_osmux_h);
+ osmux_xfrm_output_flush(pcap_osmux_h);
osmo_select_main(0);
}
osmo_jibuf_delete(jb);
+ talloc_free(pcap_osmux_h);
pcap_test_check();
}
@@ -610,7 +613,7 @@ int main(int argc, char **argv)
void *tall_ctx = talloc_named_const(NULL, 1, "Root context");
msgb_talloc_ctx_init(tall_ctx, 0);
osmo_init_logging2(tall_ctx, &jibuf_test_log_info);
- log_set_print_filename(osmo_stderr_target, 0);
+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
if(opt_debug_human && !opt_debug_table)
diff --git a/tests/osmo-pcap-test/configure.ac b/tests/osmo-pcap-test/configure.ac
index 47fbfe2..8cee4db 100644
--- a/tests/osmo-pcap-test/configure.ac
+++ b/tests/osmo-pcap-test/configure.ac
@@ -16,7 +16,7 @@ PKG_PROG_PKG_CONFIG([0.20])
dnl kernel style compile messages
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
-PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 0.3.0)
+PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.9.0)
AC_PROG_CC
AC_DISABLE_STATIC
diff --git a/tests/osmo-pcap-test/osmux_test.c b/tests/osmo-pcap-test/osmux_test.c
index e6bbeb1..891743a 100644
--- a/tests/osmo-pcap-test/osmux_test.c
+++ b/tests/osmo-pcap-test/osmux_test.c
@@ -37,7 +37,7 @@
* This is the output handle for osmux, it stores last RTP sequence and
* timestamp that has been used. There should be one per circuit ID.
*/
-static struct osmux_out_handle h_output;
+static struct osmux_out_handle *h_output;
static void tx_cb(struct msgb *msg, void *data)
{
@@ -57,7 +57,7 @@ static void deliver(struct msgb *batch_msg)
/* This code below belongs to the osmux receiver */
while((osmuxh = osmux_xfrm_output_pull(batch_msg)) != NULL)
- osmux_xfrm_output_sched(&h_output, osmuxh);
+ osmux_xfrm_output_sched(h_output, osmuxh);
msgb_free(batch_msg);
}
@@ -65,11 +65,7 @@ static void deliver(struct msgb *batch_msg)
* This is the input handle for osmux. It stores the last osmux sequence that
* has been used and the deliver function that sends the osmux batch.
*/
-struct osmux_in_handle h_input = {
- .osmux_seq = 0, /* sequence number to start OSmux message from */
- .batch_factor = 4, /* batch up to 4 RTP messages */
- .deliver = deliver,
-};
+struct osmux_in_handle *h_input;
#define MAX_CONCURRENT_CALLS 8
@@ -124,9 +120,9 @@ static int pcap_test_run(struct msgb *msg)
if (ccid < 0)
register_ccid(rtph->ssrc);
- while ((ret = osmux_xfrm_input(&h_input, msg, ccid)) > 1) {
+ while ((ret = osmux_xfrm_input(h_input, msg, ccid)) > 0) {
/* batch full, deliver it */
- osmux_xfrm_input_deliver(&h_input);
+ osmux_xfrm_input_deliver(h_input);
}
if (ret == -1)
printf("something is wrong\n");
@@ -189,9 +185,15 @@ int main(int argc, char *argv[])
osmo_pcap.timer.cb = osmo_pcap_pkt_timer_cb;
- osmux_xfrm_input_init(&h_input);
- osmux_xfrm_output_init2(&h_output, 0, 98);
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, NULL);
+ h_input = osmux_xfrm_input_alloc(tall_test);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 0);
+ osmux_xfrm_input_set_batch_factor(h_input, 4);
+ osmux_xfrm_input_set_deliver_cb(h_input, deliver, NULL);
+
+ h_output = osmux_xfrm_output_alloc(tall_test);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, 0);
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, NULL);
/* first run */
osmo_pcap_pkt_timer_cb(NULL);
@@ -200,5 +202,7 @@ int main(int argc, char *argv[])
osmo_select_main(0);
}
+ talloc_free(h_output);
+
return ret;
}
diff --git a/tests/osmux/osmux_input_test.c b/tests/osmux/osmux_input_test.c
new file mode 100644
index 0000000..df02423
--- /dev/null
+++ b/tests/osmux/osmux_input_test.c
@@ -0,0 +1,732 @@
+/* (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ *
+ * Author: Pau Espin Pedrol <pespin@sysmocom.de>
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <stdint.h>
+#include <inttypes.h>
+#include <string.h>
+#include <signal.h>
+#include <arpa/inet.h>
+#include <sys/time.h>
+#include <getopt.h>
+
+#include <osmocom/core/select.h>
+#include <osmocom/core/application.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/netif/rtp.h>
+#include <osmocom/netif/osmux.h>
+#include <osmocom/netif/amr.h>
+
+static uint16_t rtp_next_seq;
+static uint16_t rtp_next_ts;
+
+void *tall_ctx;
+
+#define TIME_RTP_PKT_MS 20
+#define BATCH_FACTOR 6
+/* ----------------------------- */
+
+/* Logging related stuff */
+#define INT2IDX(x) (-1*(x)-1)
+struct log_info_cat jibuf_test_cat[] = {
+ [INT2IDX(DLMUX)] = {
+ .name = "DLMUX",
+ .description = "Osmocom Osmux",
+ .enabled = 1, .loglevel = LOGL_DEBUG,
+ },
+};
+const struct log_info log_info = {
+ .filter_fn = NULL,
+ .cat = jibuf_test_cat,
+ .num_cat = ARRAY_SIZE(jibuf_test_cat),
+};
+/* ----------------------------- */
+
+static void rtp_init(uint16_t seq, uint16_t ts)
+{
+ rtp_next_seq = seq;
+ rtp_next_ts = ts;
+}
+
+static struct msgb *rtp_new(uint16_t seq, uint8_t timestamp, uint8_t marker)
+{
+ struct msgb *msg;
+ struct rtp_hdr *rtph;
+
+ msg = msgb_alloc(1500, "rtp");
+ if (!msg)
+ exit(EXIT_FAILURE);
+ msgb_put(msg, sizeof(struct rtp_hdr));
+
+ rtph = (struct rtp_hdr *)msg->data;
+ rtph->version = RTP_VERSION;
+ rtph->marker = marker;
+ rtph->sequence = htons(seq);
+ rtph->timestamp = htons(timestamp);
+ rtph->ssrc = 0x6789;
+ return msg;
+}
+
+static struct msgb *rtp_next(void)
+{
+ rtp_next_seq++;
+ rtp_next_ts += TIME_RTP_PKT_MS;
+ return rtp_new(rtp_next_seq, rtp_next_ts, 0);
+}
+
+static struct amr_hdr *rtp_append_amr(struct msgb *msg, uint8_t ft)
+{
+ struct amr_hdr *amrh;
+ struct rtp_hdr *rtph = (struct rtp_hdr *)msg->data;
+
+ msgb_put(msg, sizeof(struct amr_hdr));
+ amrh = (struct amr_hdr *)rtph->data;
+
+ amrh->cmr = 0;
+ amrh->q = 1;
+ amrh->f = 0;
+ amrh->ft = ft;
+ msgb_put(msg, osmo_amr_bytes(amrh->ft));
+ return amrh;
+}
+
+static void sigalarm_handler(int foo)
+{
+ printf("FAIL: test did not run successfully\n");
+ exit(EXIT_FAILURE);
+}
+
+#define clock_debug(fmt, args...) \
+ do { \
+ struct timespec ts; \
+ struct timeval tv; \
+ osmo_clock_gettime(CLOCK_MONOTONIC, &ts); \
+ osmo_gettimeofday(&tv, NULL); \
+ fprintf(stdout, "sys={%lu.%06lu}, mono={%lu.%06lu}: " fmt "\n", \
+ tv.tv_sec, tv.tv_usec, ts.tv_sec, ts.tv_nsec/1000, ##args); \
+ } while (0)
+
+static void clock_override_enable(bool enable)
+{
+ osmo_gettimeofday_override = enable;
+ osmo_clock_override_enable(CLOCK_MONOTONIC, enable);
+}
+
+static void clock_override_set(long sec, long usec)
+{
+ struct timespec *mono;
+ osmo_gettimeofday_override_time.tv_sec = sec;
+ osmo_gettimeofday_override_time.tv_usec = usec;
+ mono = osmo_clock_override_gettimespec(CLOCK_MONOTONIC);
+ mono->tv_sec = sec;
+ mono->tv_nsec = usec*1000;
+
+ clock_debug("clock_override_set");
+}
+
+static void clock_override_add_debug(long sec, long usec, bool dbg)
+{
+ osmo_gettimeofday_override_add(sec, usec);
+ osmo_clock_override_add(CLOCK_MONOTONIC, sec, usec*1000);
+ if (dbg)
+ clock_debug("clock_override_add");
+}
+#define clock_override_add(sec, usec) clock_override_add_debug(sec, usec, true)
+
+static void test_amr_ft_change_middle_batch_osmux_deliver_cb(struct msgb *batch_msg, void *data)
+{
+ struct osmux_hdr *osmuxh;
+ char buf[2048];
+ int n = 0;
+ bool *osmux_transmitted = (bool *)data;
+
+ osmux_snprintf(buf, sizeof(buf), batch_msg);
+ clock_debug("OSMUX message (len=%d): %s\n", batch_msg->len, buf);
+
+ /* We expect 3 batches: */
+ while ((osmuxh = osmux_xfrm_output_pull(batch_msg))) {
+ n++;
+ OSMO_ASSERT(osmuxh->ft == OSMUX_FT_VOICE_AMR);
+ OSMO_ASSERT(osmuxh->rtp_m == 0);
+ OSMO_ASSERT(osmuxh->amr_cmr == 0);
+ OSMO_ASSERT(osmuxh->amr_q == 1);
+ switch (n) {
+ case 1:
+ OSMO_ASSERT(osmuxh->seq == 0);
+ OSMO_ASSERT(osmuxh->ctr == 1);
+ OSMO_ASSERT(osmuxh->amr_ft == AMR_FT_2);
+ break;
+ case 2:
+ OSMO_ASSERT(osmuxh->seq == 1);
+ OSMO_ASSERT(osmuxh->ctr == 0);
+ OSMO_ASSERT(osmuxh->amr_ft == AMR_FT_6);
+ break;
+ case 3:
+ OSMO_ASSERT(osmuxh->seq == 2);
+ OSMO_ASSERT(osmuxh->ctr == 0);
+ OSMO_ASSERT(osmuxh->amr_ft == AMR_FT_1);
+ break;
+ }
+ }
+ OSMO_ASSERT(n == 3);
+
+ msgb_free(batch_msg);
+
+ *osmux_transmitted = true;
+}
+/* Test if an RTP pkt with changed AMR FT passed to osmux_input is properly
+ * processed: The current batch ends and a new batch with a new osmux header is
+ * appeneded to the generated packet. */
+static void test_amr_ft_change_middle_batch(void)
+{
+ struct msgb *msg;
+ int rc;
+ const uint8_t cid = 30;
+ bool osmux_transmitted = false;
+ struct osmux_in_handle *h_input;
+
+ printf("===%s===\n", __func__);
+
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(0, 0);
+
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 0);
+ osmux_xfrm_input_set_batch_factor(h_input, 4);
+ osmux_xfrm_input_set_deliver_cb(h_input,
+ test_amr_ft_change_middle_batch_osmux_deliver_cb,
+ &osmux_transmitted);
+ osmux_xfrm_input_open_circuit(h_input, cid, false);
+
+ /* First RTP frame at t=0 */
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* Second RTP frame at t=20 */
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* Third RTP frame at t=40, AMR FT changes: */
+ clock_debug("Submit RTP with 1st AMR FT change");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_6);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* Forth RTP frame at t=60, AMR FT changes again: */
+ clock_debug("Submit RTP with 2nd AMR FT change");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_1);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* t=80, osmux batch is scheduled to be transmitted: */
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ clock_debug("Osmux frame should now be transmitted");
+ osmo_select_main(0);
+ OSMO_ASSERT(osmux_transmitted == true);
+
+ clock_debug("Closing circuit");
+ osmux_xfrm_input_close_circuit(h_input, cid);
+ talloc_free(h_input);
+}
+
+static void test_last_amr_cmr_f_q_used_osmux_deliver_cb(struct msgb *batch_msg, void *data)
+{
+ struct osmux_hdr *osmuxh;
+ char buf[2048];
+ bool *osmux_transmitted = (bool *)data;
+
+ osmux_snprintf(buf, sizeof(buf), batch_msg);
+ clock_debug("OSMUX message (len=%d): %s\n", batch_msg->len, buf);
+
+ /* We expect 1 batch: */
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh);
+ OSMO_ASSERT(osmuxh->ft == OSMUX_FT_VOICE_AMR);
+ /* Check CMR and Q values are the ones from the last message: */
+ OSMO_ASSERT(osmuxh->amr_f == 0);
+ OSMO_ASSERT(osmuxh->amr_q == 0);
+ OSMO_ASSERT(osmuxh->amr_cmr == 2);
+
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh == NULL);
+
+ msgb_free(batch_msg);
+
+ *osmux_transmitted = true;
+}
+/* Test that fields CMR, F and Q of the last RTP packet in the batch are the
+ * ones set in the osmux batch header. */
+static void test_last_amr_cmr_f_q_used(void)
+{
+ struct msgb *msg;
+ int rc;
+ const uint8_t cid = 32;
+ bool osmux_transmitted = false;
+ struct amr_hdr *amrh;
+ struct osmux_in_handle *h_input;
+
+ printf("===%s===\n", __func__);
+
+
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(0, 0);
+
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 0);
+ osmux_xfrm_input_set_batch_factor(h_input, 3);
+ osmux_xfrm_input_set_deliver_cb(h_input,
+ test_last_amr_cmr_f_q_used_osmux_deliver_cb,
+ &osmux_transmitted);
+ osmux_xfrm_input_open_circuit(h_input, cid, false);
+
+ /* First RTP frame at t=0 */
+ msg = rtp_next();
+ amrh = rtp_append_amr(msg, AMR_FT_2);
+ amrh->f = 1;
+ amrh->q = 1;
+ amrh->cmr = 0;
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* Second RTP frame at t=20, CMR changes 0->1 */
+ clock_debug("Submit 2nd RTP packet, CMR changes");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ amrh = rtp_append_amr(msg, AMR_FT_2);
+ amrh->f = 1;
+ amrh->q = 1;
+ amrh->cmr = 1;
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* Third RTP frame at t=40, q changes 1->0, CMR changes 1->2: */
+ clock_debug("Submit 3rd RTP packet with Q and CMR changes");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ amrh = rtp_append_amr(msg, AMR_FT_2);
+ amrh->f = 0;
+ amrh->q = 0;
+ amrh->cmr = 2;
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* t=60, osmux batch is scheduled to be transmitted: */
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ clock_debug("Osmux frame should now be transmitted");
+ osmo_select_main(0);
+ OSMO_ASSERT(osmux_transmitted == true);
+
+ clock_debug("Closing circuit");
+ osmux_xfrm_input_close_circuit(h_input, cid);
+ talloc_free(h_input);
+}
+
+static void test_initial_osmux_seqnum_osmux_deliver_cb(struct msgb *batch_msg, void *data)
+{
+ struct osmux_hdr *osmuxh;
+ char buf[2048];
+ bool *osmux_transmitted = (bool *)data;
+
+ osmux_snprintf(buf, sizeof(buf), batch_msg);
+ clock_debug("OSMUX message (len=%d): %s\n", batch_msg->len, buf);
+
+ /* We expect 1 batch: */
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh);
+ /* Check seqnum is the one configured beforehand: */
+ OSMO_ASSERT(osmuxh->seq == 123);
+
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh == NULL);
+
+ msgb_free(batch_msg);
+
+ *osmux_transmitted = true;
+}
+/* Test that the first transmitted osmux header is set according to what has been configured. */
+static void test_initial_osmux_seqnum(void)
+{
+ struct msgb *msg;
+ int rc;
+ const uint8_t cid = 33;
+ bool osmux_transmitted = false;
+ struct amr_hdr *amrh;
+ struct osmux_in_handle *h_input;
+
+ printf("===%s===\n", __func__);
+
+
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(0, 0);
+
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 123);
+ osmux_xfrm_input_set_batch_factor(h_input, 1);
+ osmux_xfrm_input_set_deliver_cb(h_input,
+ test_initial_osmux_seqnum_osmux_deliver_cb,
+ &osmux_transmitted);
+ osmux_xfrm_input_open_circuit(h_input, cid, false);
+
+ /* First RTP frame at t=0 */
+ msg = rtp_next();
+ amrh = rtp_append_amr(msg, AMR_FT_2);
+ amrh->f = 1;
+ amrh->q = 1;
+ amrh->cmr = 0;
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* t=20, osmux batch is scheduled to be transmitted: */
+ clock_debug("Submit 2nd RTP packet, CMR changes");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ osmo_select_main(0);
+ OSMO_ASSERT(osmux_transmitted == true);
+
+ clock_debug("Closing circuit");
+ osmux_xfrm_input_close_circuit(h_input, cid);
+ talloc_free(h_input);
+}
+
+static void test_rtp_dup_osmux_deliver_cb(struct msgb *batch_msg, void *data)
+{
+ struct osmux_hdr *osmuxh;
+ char buf[2048];
+ uint8_t *osmux_pl;
+ bool *osmux_transmitted = (bool *)data;
+
+ osmux_snprintf(buf, sizeof(buf), batch_msg);
+ clock_debug("OSMUX message (len=%d): %s\n", batch_msg->len, buf);
+
+ /* We expect 1 batch: */
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh);
+ /* Check seqnum is the one configured beforehand: */
+ OSMO_ASSERT(osmuxh->seq == 123);
+ osmux_pl = (uint8_t *)osmuxh + sizeof(*osmuxh);
+ OSMO_ASSERT(osmux_pl[0] == 0x12);
+
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh == NULL);
+
+ msgb_free(batch_msg);
+
+ *osmux_transmitted = true;
+}
+/* Test user pushes duplicated RTP (dup seqnum) to osmux: */
+static void test_rtp_dup(void)
+{
+ struct msgb *msg, *msg_dup;
+ struct amr_hdr *amrh;
+ int rc;
+ const uint8_t cid = 33;
+ bool osmux_transmitted = false;
+ struct osmux_in_handle *h_input;
+
+ printf("===%s===\n", __func__);
+
+
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(0, 0);
+
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 123);
+ osmux_xfrm_input_set_batch_factor(h_input, 2);
+ osmux_xfrm_input_set_deliver_cb(h_input,
+ test_rtp_dup_osmux_deliver_cb,
+ &osmux_transmitted);
+ osmux_xfrm_input_open_circuit(h_input, cid, false);
+
+ /* First RTP frame at t=0 */
+ msg = rtp_next();
+ msg_dup = msgb_copy(msg, "dup");
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ clock_debug("Submit 2nd RTP packet, seqnum dup");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ amrh = rtp_append_amr(msg_dup, AMR_FT_2);
+ amrh->data[0] = 0x12; /* Change AMR payload to check it is updated. */
+ rc = osmux_xfrm_input(h_input, msg_dup, cid);
+ OSMO_ASSERT(rc == 0);
+ OSMO_ASSERT(osmux_transmitted == false);
+
+ /* t=60, osmux batch is scheduled to be transmitted: */
+ clock_debug("Submit 3rd RTP packet, triggers osmux batch");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ osmo_select_main(0);
+ OSMO_ASSERT(osmux_transmitted == true);
+
+ clock_debug("Closing circuit");
+ osmux_xfrm_input_close_circuit(h_input, cid);
+ talloc_free(h_input);
+}
+
+/* Test some scenario where one RTP packet is lost */
+static void test_rtp_pkt_gap_osmux_deliver_cb(struct msgb *batch_msg, void *data)
+{
+ struct osmux_hdr *osmuxh;
+ char buf[2048];
+ bool *osmux_transmitted = (bool *)data;
+
+ osmux_snprintf(buf, sizeof(buf), batch_msg);
+ clock_debug("OSMUX message (len=%d): %s\n", batch_msg->len, buf);
+
+ /* We expect 1 batch: */
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh);
+ /* Check seqnum is the one configured beforehand: */
+ OSMO_ASSERT(osmuxh->seq == 123);
+ /* Check four AMR payloads appear: */
+ OSMO_ASSERT(osmuxh->ctr == 3);
+
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh == NULL);
+
+ msgb_free(batch_msg);
+
+ *osmux_transmitted = true;
+}
+static void test_rtp_pkt_gap(uint16_t rtp_start_seqnum)
+{
+ struct msgb *msg;
+ int rc;
+ const uint8_t cid = 33;
+ bool osmux_transmitted = false;
+ struct osmux_in_handle *h_input;
+
+ printf("===%s(%" PRIu16 ")===\n", __func__, rtp_start_seqnum);
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(rtp_start_seqnum, 18000);
+
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 123);
+ osmux_xfrm_input_set_batch_factor(h_input, 4);
+ osmux_xfrm_input_set_deliver_cb(h_input,
+ test_rtp_pkt_gap_osmux_deliver_cb,
+ &osmux_transmitted);
+ osmux_xfrm_input_open_circuit(h_input, cid, false);
+
+ /* First RTP frame at t=0 */
+ clock_debug("1st RTP packet is received");
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ clock_debug("2nd RTP packet is lost");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ msgb_free(msg);
+
+ clock_debug("3rd RTP packet is received");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ clock_debug("4th RTP packet is received");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* t=80, osmux batch is scheduled to be transmitted: */
+ clock_debug("osmux batch transmitted");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ osmo_select_main(0);
+ OSMO_ASSERT(osmux_transmitted == true);
+
+ clock_debug("Closing circuit");
+ osmux_xfrm_input_close_circuit(h_input, cid);
+ talloc_free(h_input);
+}
+
+/* Test some scenario where some RTP packets (>batch_factor) are lost */
+static void test_rtp_pkt_gap_bigger_than_batch_factor_osmux_deliver_cb(struct msgb *batch_msg, void *data)
+{
+ struct osmux_hdr *osmuxh;
+ char buf[2048];
+ unsigned *osmux_transmitted = (unsigned *)data;
+ (*osmux_transmitted)++;
+
+ osmux_snprintf(buf, sizeof(buf), batch_msg);
+ clock_debug("OSMUX message %u (len=%d): %s\n", *osmux_transmitted, batch_msg->len, buf);
+
+ /* We expect 1 batch: */
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh);
+ /* Check seqnum is the one configured beforehand: */
+ OSMO_ASSERT(osmuxh->seq == (123 + *osmux_transmitted - 1));
+ /* Check four AMR payloads appear: */
+ OSMO_ASSERT(osmuxh->ctr == 3);
+
+ /* Second osmux frame: is it expected to have the Marker bit set, since
+ * there was an incoming RTP jump between this resulting osmux frame and
+ * the previous one. */
+ if (*osmux_transmitted == 2)
+ OSMO_ASSERT(osmuxh->rtp_m == 1);
+
+ osmuxh = osmux_xfrm_output_pull(batch_msg);
+ OSMO_ASSERT(osmuxh == NULL);
+
+ msgb_free(batch_msg);
+}
+static void test_rtp_pkt_gap_bigger_than_batch_factor(uint16_t rtp_start_seqnum)
+{
+ struct msgb *msg;
+ int rc;
+ const uint8_t cid = 33;
+ unsigned osmux_transmitted = 0;
+ struct osmux_in_handle *h_input;
+ int i;
+
+ printf("===%s(%" PRIu16 ")===\n", __func__, rtp_start_seqnum);
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ rtp_init(rtp_start_seqnum, 18000);
+
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_initial_seqnum(h_input, 123);
+ osmux_xfrm_input_set_batch_factor(h_input, 4);
+ osmux_xfrm_input_set_deliver_cb(h_input,
+ test_rtp_pkt_gap_bigger_than_batch_factor_osmux_deliver_cb,
+ &osmux_transmitted);
+ osmux_xfrm_input_open_circuit(h_input, cid, false);
+
+ /* First RTP frame at t=0 */
+ clock_debug("1st RTP packet is received");
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ clock_debug("10 packets are lost");
+ for (i = 0; i < 10; i++) {
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ msgb_free(msg);
+ }
+
+ clock_debug("12th RTP packet is received");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ /* The recreation of lost pkts fills the batch and hence triggers transmission of osmux frame: */
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 1);
+ /* We call deliver as requested by API: */
+ osmux_xfrm_input_deliver(h_input);
+ OSMO_ASSERT(osmux_transmitted == 1);
+ /* We try to feed the RTP packet again as per API. This time 0 is
+ * received, pkt is stored in osmux layer. This is because we don't
+ * recreate entire batches with fake data. Instead, Osmux should use the
+ * Marker bit to announce the peer there was a (potentially huge) jump
+ * in seqnums. */
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ /* We continue filling the current batch so it gets transmitted: */
+ clock_debug("12th+1 RTP packet is received");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ clock_debug("12th+2 RTP packet is received");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ clock_debug("12th+3 RTP packet is received");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ msg = rtp_next();
+ rtp_append_amr(msg, AMR_FT_2);
+ rc = osmux_xfrm_input(h_input, msg, cid);
+ OSMO_ASSERT(rc == 0);
+
+ clock_debug("osmux batch transmitted");
+ clock_override_add(0, TIME_RTP_PKT_MS*1000);
+ osmo_select_main(0);
+ OSMO_ASSERT(osmux_transmitted == 2);
+
+ clock_debug("Closing circuit");
+ osmux_xfrm_input_close_circuit(h_input, cid);
+ talloc_free(h_input);
+}
+
+int main(int argc, char **argv)
+{
+
+ if (signal(SIGALRM, sigalarm_handler) == SIG_ERR) {
+ perror("signal");
+ exit(EXIT_FAILURE);
+ }
+
+ tall_ctx = talloc_named_const(NULL, 1, "Root context");
+ msgb_talloc_ctx_init(tall_ctx, 0);
+ osmo_init_logging2(tall_ctx, &log_info);
+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
+ log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
+ log_set_category_filter(osmo_stderr_target, DLMUX, 1, LOGL_DEBUG);
+
+ alarm(10);
+
+ test_amr_ft_change_middle_batch();
+ test_last_amr_cmr_f_q_used();
+ test_initial_osmux_seqnum();
+ test_rtp_dup();
+ test_rtp_pkt_gap(60);
+ /* Test several wraparound scenarios: */
+ test_rtp_pkt_gap(65533);
+ test_rtp_pkt_gap(65534);
+ test_rtp_pkt_gap(65535);
+ test_rtp_pkt_gap_bigger_than_batch_factor(60);
+ /* Test several wraparound scenarios: */
+ test_rtp_pkt_gap_bigger_than_batch_factor(65533);
+ test_rtp_pkt_gap_bigger_than_batch_factor(65534);
+ test_rtp_pkt_gap_bigger_than_batch_factor(65535);
+
+ fprintf(stdout, "OK: Test passed\n");
+ return EXIT_SUCCESS;
+}
diff --git a/tests/osmux/osmux_input_test.ok b/tests/osmux/osmux_input_test.ok
new file mode 100644
index 0000000..9441216
--- /dev/null
+++ b/tests/osmux/osmux_input_test.ok
@@ -0,0 +1,212 @@
+===test_amr_ft_change_middle_batch===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: Submit RTP with 1st AMR FT change
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: Submit RTP with 2nd AMR FT change
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.080000}, mono={0.080000}: Osmux frame should now be transmitted
+sys={0.080000}, mono={0.080000}: OSMUX message (len=81): OSMUX seq=000 ccid=030 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ], OSMUX seq=001 ccid=030 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=06 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ], OSMUX seq=002 ccid=030 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=01 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.080000}, mono={0.080000}: Closing circuit
+===test_last_amr_cmr_f_q_used===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: Submit 2nd RTP packet, CMR changes
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: Submit 3rd RTP packet with Q and CMR changes
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.060000}, mono={0.060000}: Osmux frame should now be transmitted
+sys={0.060000}, mono={0.060000}: OSMUX message (len=49): OSMUX seq=000 ccid=032 ft=1 rtp_m=0 ctr=2 amr_f=0 amr_q=0 amr_ft=02 amr_cmr=02 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.060000}, mono={0.060000}: Closing circuit
+===test_initial_osmux_seqnum===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: Submit 2nd RTP packet, CMR changes
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: OSMUX message (len=19): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=0 amr_f=1 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.020000}, mono={0.020000}: Closing circuit
+===test_rtp_dup===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: Submit 2nd RTP packet, seqnum dup
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: Submit 3rd RTP packet, triggers osmux batch
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: OSMUX message (len=19): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 12 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.040000}, mono={0.040000}: Closing circuit
+===test_rtp_pkt_gap(60)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 2nd RTP packet is lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: 3rd RTP packet is received
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: 4th RTP packet is received
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.060000}, mono={0.060000}: osmux batch transmitted
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.080000}, mono={0.080000}: OSMUX message (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.080000}, mono={0.080000}: Closing circuit
+===test_rtp_pkt_gap(65533)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 2nd RTP packet is lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: 3rd RTP packet is received
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: 4th RTP packet is received
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.060000}, mono={0.060000}: osmux batch transmitted
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.080000}, mono={0.080000}: OSMUX message (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.080000}, mono={0.080000}: Closing circuit
+===test_rtp_pkt_gap(65534)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 2nd RTP packet is lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: 3rd RTP packet is received
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: 4th RTP packet is received
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.060000}, mono={0.060000}: osmux batch transmitted
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.080000}, mono={0.080000}: OSMUX message (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.080000}, mono={0.080000}: Closing circuit
+===test_rtp_pkt_gap(65535)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 2nd RTP packet is lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.020000}, mono={0.020000}: 3rd RTP packet is received
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: 4th RTP packet is received
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.060000}, mono={0.060000}: osmux batch transmitted
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.080000}, mono={0.080000}: OSMUX message (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.080000}, mono={0.080000}: Closing circuit
+===test_rtp_pkt_gap_bigger_than_batch_factor(60)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 10 packets are lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.100000}, mono={0.100000}: clock_override_add
+sys={0.120000}, mono={0.120000}: clock_override_add
+sys={0.140000}, mono={0.140000}: clock_override_add
+sys={0.160000}, mono={0.160000}: clock_override_add
+sys={0.180000}, mono={0.180000}: clock_override_add
+sys={0.200000}, mono={0.200000}: clock_override_add
+sys={0.200000}, mono={0.200000}: 12th RTP packet is received
+sys={0.220000}, mono={0.220000}: clock_override_add
+sys={0.220000}, mono={0.220000}: OSMUX message 1 (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.220000}, mono={0.220000}: 12th+1 RTP packet is received
+sys={0.240000}, mono={0.240000}: clock_override_add
+sys={0.240000}, mono={0.240000}: 12th+2 RTP packet is received
+sys={0.260000}, mono={0.260000}: clock_override_add
+sys={0.260000}, mono={0.260000}: 12th+3 RTP packet is received
+sys={0.280000}, mono={0.280000}: clock_override_add
+sys={0.280000}, mono={0.280000}: osmux batch transmitted
+sys={0.300000}, mono={0.300000}: clock_override_add
+sys={0.300000}, mono={0.300000}: OSMUX message 2 (len=64): OSMUX seq=124 ccid=033 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.300000}, mono={0.300000}: Closing circuit
+===test_rtp_pkt_gap_bigger_than_batch_factor(65533)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 10 packets are lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.100000}, mono={0.100000}: clock_override_add
+sys={0.120000}, mono={0.120000}: clock_override_add
+sys={0.140000}, mono={0.140000}: clock_override_add
+sys={0.160000}, mono={0.160000}: clock_override_add
+sys={0.180000}, mono={0.180000}: clock_override_add
+sys={0.200000}, mono={0.200000}: clock_override_add
+sys={0.200000}, mono={0.200000}: 12th RTP packet is received
+sys={0.220000}, mono={0.220000}: clock_override_add
+sys={0.220000}, mono={0.220000}: OSMUX message 1 (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.220000}, mono={0.220000}: 12th+1 RTP packet is received
+sys={0.240000}, mono={0.240000}: clock_override_add
+sys={0.240000}, mono={0.240000}: 12th+2 RTP packet is received
+sys={0.260000}, mono={0.260000}: clock_override_add
+sys={0.260000}, mono={0.260000}: 12th+3 RTP packet is received
+sys={0.280000}, mono={0.280000}: clock_override_add
+sys={0.280000}, mono={0.280000}: osmux batch transmitted
+sys={0.300000}, mono={0.300000}: clock_override_add
+sys={0.300000}, mono={0.300000}: OSMUX message 2 (len=64): OSMUX seq=124 ccid=033 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.300000}, mono={0.300000}: Closing circuit
+===test_rtp_pkt_gap_bigger_than_batch_factor(65534)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 10 packets are lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.100000}, mono={0.100000}: clock_override_add
+sys={0.120000}, mono={0.120000}: clock_override_add
+sys={0.140000}, mono={0.140000}: clock_override_add
+sys={0.160000}, mono={0.160000}: clock_override_add
+sys={0.180000}, mono={0.180000}: clock_override_add
+sys={0.200000}, mono={0.200000}: clock_override_add
+sys={0.200000}, mono={0.200000}: 12th RTP packet is received
+sys={0.220000}, mono={0.220000}: clock_override_add
+sys={0.220000}, mono={0.220000}: OSMUX message 1 (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.220000}, mono={0.220000}: 12th+1 RTP packet is received
+sys={0.240000}, mono={0.240000}: clock_override_add
+sys={0.240000}, mono={0.240000}: 12th+2 RTP packet is received
+sys={0.260000}, mono={0.260000}: clock_override_add
+sys={0.260000}, mono={0.260000}: 12th+3 RTP packet is received
+sys={0.280000}, mono={0.280000}: clock_override_add
+sys={0.280000}, mono={0.280000}: osmux batch transmitted
+sys={0.300000}, mono={0.300000}: clock_override_add
+sys={0.300000}, mono={0.300000}: OSMUX message 2 (len=64): OSMUX seq=124 ccid=033 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.300000}, mono={0.300000}: Closing circuit
+===test_rtp_pkt_gap_bigger_than_batch_factor(65535)===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: 1st RTP packet is received
+sys={0.000000}, mono={0.000000}: 10 packets are lost
+sys={0.020000}, mono={0.020000}: clock_override_add
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.060000}, mono={0.060000}: clock_override_add
+sys={0.080000}, mono={0.080000}: clock_override_add
+sys={0.100000}, mono={0.100000}: clock_override_add
+sys={0.120000}, mono={0.120000}: clock_override_add
+sys={0.140000}, mono={0.140000}: clock_override_add
+sys={0.160000}, mono={0.160000}: clock_override_add
+sys={0.180000}, mono={0.180000}: clock_override_add
+sys={0.200000}, mono={0.200000}: clock_override_add
+sys={0.200000}, mono={0.200000}: 12th RTP packet is received
+sys={0.220000}, mono={0.220000}: clock_override_add
+sys={0.220000}, mono={0.220000}: OSMUX message 1 (len=64): OSMUX seq=123 ccid=033 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.220000}, mono={0.220000}: 12th+1 RTP packet is received
+sys={0.240000}, mono={0.240000}: clock_override_add
+sys={0.240000}, mono={0.240000}: 12th+2 RTP packet is received
+sys={0.260000}, mono={0.260000}: clock_override_add
+sys={0.260000}, mono={0.260000}: 12th+3 RTP packet is received
+sys={0.280000}, mono={0.280000}: clock_override_add
+sys={0.280000}, mono={0.280000}: osmux batch transmitted
+sys={0.300000}, mono={0.300000}: clock_override_add
+sys={0.300000}, mono={0.300000}: OSMUX message 2 (len=64): OSMUX seq=124 ccid=033 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=00 [ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ]
+
+sys={0.300000}, mono={0.300000}: Closing circuit
+OK: Test passed
diff --git a/tests/osmux/osmux_test2.c b/tests/osmux/osmux_output_test.c
index ffe1101..94d6a5b 100644
--- a/tests/osmux/osmux_test2.c
+++ b/tests/osmux/osmux_output_test.c
@@ -155,22 +155,26 @@ static void tx_cb(struct msgb *msg, void *data)
OSMO_ASSERT(_rc == _osmuxh->ctr+1); \
}
+/* Test some regular scenario where frames arrive at exactly the time they should. */
static void test_output_consecutive(void)
{
- struct osmux_out_handle h_output;
+ struct osmux_out_handle *h_output;
printf("===test_output_consecutive===\n");
clock_override_enable(true);
clock_override_set(0, 0);
osmux_init(32);
- osmux_xfrm_output_init2(&h_output, 0x7000000, 98);
- h_output.rtp_seq = (uint16_t)50;
- h_output.rtp_timestamp = (uint32_t)500;
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+ h_output = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, 0x7000000);
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, h_output);
+ h_output->rtp_seq = (uint16_t)50;
+ h_output->rtp_timestamp = (uint32_t)500;
/* First osmux frame at t=0 */
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_debug("first dequed before first select");
osmo_select_main(0);
@@ -193,11 +197,11 @@ static void test_output_consecutive(void)
clock_override_add(0, TIME_RTP_PKT_MS*1000);
clock_debug("sixth select, sixth dequed");
osmo_select_main(0);
- OSMO_ASSERT(llist_empty(&h_output.list));
+ OSMO_ASSERT(llist_empty(&h_output->list));
/* Second osmux frame at t=80 */
clock_debug("send second osmux frame");
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_debug("first dequed before first select");
osmo_select_main(0);
@@ -208,33 +212,44 @@ static void test_output_consecutive(void)
clock_override_add(0, 4*TIME_RTP_PKT_MS*1000);
clock_debug("third select, four packet should be dequeued");
osmo_select_main(0);
- OSMO_ASSERT(llist_empty(&h_output.list));
- OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+ OSMO_ASSERT(llist_empty(&h_output->list));
+ OSMO_ASSERT(!osmo_timer_pending(&h_output->timer));
clock_debug("calling flush on empty list, should do nothing");
- osmux_xfrm_output_flush(&h_output);
- OSMO_ASSERT(llist_empty(&h_output.list));
- OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+ osmux_xfrm_output_flush(h_output);
+ OSMO_ASSERT(llist_empty(&h_output->list));
+ OSMO_ASSERT(!osmo_timer_pending(&h_output->timer));
+
+ talloc_free(h_output);
}
+/* Test that receiving new osmux frame triggers flushing of RTP pakcets
+ * generated from previous one, to avoid steady growing delay in scheduling due to
+ * jitter of osmux packets received. Specifically test case where the 2 Osmux
+ * packets arrive with a small delay of system time in between them, aka the 1st
+ * Osmux frame has had some of its AMR payloads already forwarded as RTP to the
+ * upper layers. */
static void test_output_interleaved(void)
{
- struct osmux_out_handle h_output;
+ struct osmux_out_handle *h_output;
printf("===test_output_interleaved===\n");
clock_override_enable(true);
clock_override_set(0, 0);
osmux_init(32);
- osmux_xfrm_output_init2(&h_output, 0x7000000, 98);
- h_output.rtp_seq = (uint16_t)50;
- h_output.rtp_timestamp = (uint32_t)500;
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+ h_output = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, 0x7000000);
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, h_output);
+ h_output->rtp_seq = (uint16_t)50;
+ h_output->rtp_timestamp = (uint32_t)500;
/* First osmux frame at t=0, but it actually arrives late due to jitter,
so 2nd frame is going to arrive before the 1st one is completelly
scheduled */
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_override_add(0, 2*TIME_RTP_PKT_MS*1000);
clock_debug("select, 3 dequed, 3 still queued");
@@ -242,68 +257,84 @@ static void test_output_interleaved(void)
/* Second osmux frame at t=0 */
clock_debug("next frame arrives, 3 pending rtp packets are dequeued and first of new osmux frame too");
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
osmo_select_main(0);
- OSMO_ASSERT(llist_count(&h_output.list) == 5);
+ OSMO_ASSERT(llist_count(&h_output->list) == 5);
clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
clock_debug("calling select, then all should be out");
osmo_select_main(0);
- OSMO_ASSERT(llist_empty(&h_output.list));
- OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+ OSMO_ASSERT(llist_empty(&h_output->list));
+ OSMO_ASSERT(!osmo_timer_pending(&h_output->timer));
+
+ talloc_free(h_output);
}
+/* Test that receiving new osmux frame triggers flushing of RTP pakcets
+ * generated from previous one, to avoid steady growing delay in scheduling due to
+ * jitter of osmux packets received. Specifically test case where the 2 Osmux
+ * packets arrive (almost) exactly at the same time, so no internal acton is
+ * triggered between receival of those. */
static void test_output_2together(void)
{
- struct osmux_out_handle h_output;
+ struct osmux_out_handle *h_output;
printf("===test_output_2together===\n");
clock_override_enable(true);
clock_override_set(0, 0);
osmux_init(32);
- osmux_xfrm_output_init2(&h_output, 0x7000000, 98);
- h_output.rtp_seq = (uint16_t)50;
- h_output.rtp_timestamp = (uint32_t)500;
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+ h_output = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, 0x7000000);
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, h_output);
+ h_output->rtp_seq = (uint16_t)50;
+ h_output->rtp_timestamp = (uint32_t)500;
/* First osmux frame at t=0, but it actually arrives late due to jitter,
so we receive both at the same time. */
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_debug("calling select in between 2 osmux recv");
osmo_select_main(0);
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_debug("calling select after receiving 2nd osmux. Dequeue 1st osmux frame and 1st rtp from 2nd osmux frame.");
osmo_select_main(0);
- OSMO_ASSERT(llist_count(&h_output.list) == 5);
+ OSMO_ASSERT(llist_count(&h_output->list) == 5);
clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
clock_debug("select, all 5 remaining should be out");
osmo_select_main(0);
- OSMO_ASSERT(llist_empty(&h_output.list));
- OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+ OSMO_ASSERT(llist_empty(&h_output->list));
+ OSMO_ASSERT(!osmo_timer_pending(&h_output->timer));
+
+ talloc_free(h_output);
}
-/* FIXME: this test shows generated rtp stream doesn't have osmux lost frames into account! */
+/* Generated rtp stream gets first RTP pkt marked with M bit after osmux frame
+ * lost is detected (hence a gap in sequence) */
static void test_output_frame_lost(void)
{
- struct osmux_out_handle h_output;
+ struct osmux_out_handle *h_output;
printf("===test_output_frame_lost===\n");
clock_override_enable(true);
clock_override_set(0, 0);
osmux_init(32);
- osmux_xfrm_output_init2(&h_output, 0x7000000, 98);
- h_output.rtp_seq = (uint16_t)50;
- h_output.rtp_timestamp = (uint32_t)500;
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+ h_output = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, 0x7000000);
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, h_output);
+ h_output->rtp_seq = (uint16_t)50;
+ h_output->rtp_timestamp = (uint32_t)500;
clock_debug("first osmux frame");
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
osmo_select_main(0);
@@ -312,42 +343,81 @@ static void test_output_frame_lost(void)
clock_override_add(0, 6*TIME_RTP_PKT_MS*1000);
clock_debug("3rd osmux frame arrives");
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_override_add(0, 5*TIME_RTP_PKT_MS*1000);
osmo_select_main(0);
- OSMO_ASSERT(llist_empty(&h_output.list));
- OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+ OSMO_ASSERT(llist_empty(&h_output->list));
+ OSMO_ASSERT(!osmo_timer_pending(&h_output->timer));
+
+ talloc_free(h_output);
}
+/* Test all packets are transmitted immediately when osmux_xfrm_output_flush()
+ * is called. */
static void test_output_flush(void)
{
- struct osmux_out_handle h_output;
+ struct osmux_out_handle *h_output;
printf("===test_output_flush===\n");
clock_override_enable(true);
clock_override_set(0, 0);
osmux_init(32);
- osmux_xfrm_output_init2(&h_output, 0x7000000, 98);
- h_output.rtp_seq = (uint16_t)50;
- h_output.rtp_timestamp = (uint32_t)500;
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, &h_output);
+
+ h_output = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, 0x7000000);
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, h_output);
+ h_output->rtp_seq = (uint16_t)50;
+ h_output->rtp_timestamp = (uint32_t)500;
clock_debug("first osmux frame");
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_override_add(0, 2*TIME_RTP_PKT_MS*1000);
osmo_select_main(0);
clock_debug("2nd osmux frame arrives");
- PULL_NEXT(&h_output);
+ PULL_NEXT(h_output);
clock_debug("flushing, all packet should be transmitted immediately");
- OSMO_ASSERT(llist_count(&h_output.list) == 9);
- OSMO_ASSERT(osmo_timer_pending(&h_output.timer));
- osmux_xfrm_output_flush(&h_output);
- OSMO_ASSERT(llist_empty(&h_output.list));
- OSMO_ASSERT(!osmo_timer_pending(&h_output.timer));
+ OSMO_ASSERT(llist_count(&h_output->list) == 9);
+ OSMO_ASSERT(osmo_timer_pending(&h_output->timer));
+ osmux_xfrm_output_flush(h_output);
+ OSMO_ASSERT(llist_empty(&h_output->list));
+ OSMO_ASSERT(!osmo_timer_pending(&h_output->timer));
+
+ talloc_free(h_output);
+}
+
+/* Test how the osmux_out_handle behaves when seqnum 0xff->0x00 is received */
+static void test_output_seqnum_wraparound(void)
+{
+ struct osmux_out_handle *h_output;
+
+ printf("===test_output_seqnum_wraparound===\n");
+
+ clock_override_enable(true);
+ clock_override_set(0, 0);
+ osmux_init(0xff);
+
+ h_output = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output, 0x7000000);
+ osmux_xfrm_output_set_rtp_pl_type(h_output, 98);
+ osmux_xfrm_output_set_tx_cb(h_output, tx_cb, h_output);
+ h_output->rtp_seq = (uint16_t)50;
+ h_output->rtp_timestamp = (uint32_t)500;
+ h_output->osmux_seq_ack = 0xff;
+
+ clock_debug("Sending osmux frame with seqnum=0");
+ PULL_NEXT(h_output);
+ clock_override_add(0, 2*TIME_RTP_PKT_MS*1000);
+ osmo_select_main(0);
+
+ clock_debug("flushing other RTP packets");
+ osmux_xfrm_output_flush(h_output);
+
+ talloc_free(h_output);
}
int main(int argc, char **argv)
@@ -361,7 +431,7 @@ int main(int argc, char **argv)
void *tall_ctx = talloc_named_const(NULL, 1, "Root context");
msgb_talloc_ctx_init(tall_ctx, 0);
osmo_init_logging2(tall_ctx, &log_info);
- log_set_print_filename(osmo_stderr_target, 0);
+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
log_set_log_level(osmo_stderr_target, LOGL_DEBUG);
log_set_category_filter(osmo_stderr_target, DLMUX, 1, LOGL_DEBUG);
@@ -372,6 +442,7 @@ int main(int argc, char **argv)
test_output_2together();
test_output_frame_lost();
test_output_flush();
+ test_output_seqnum_wraparound();
fprintf(stdout, "OK: Test passed\n");
return EXIT_SUCCESS;
diff --git a/tests/osmux/osmux_test2.ok b/tests/osmux/osmux_output_test.ok
index 53ab67d..f08748f 100644
--- a/tests/osmux/osmux_test2.ok
+++ b/tests/osmux/osmux_output_test.ok
@@ -105,4 +105,15 @@ sys={0.040000}, mono={0.040000}: dequeue: seq=58 ts=1780 enqueued=3
sys={0.040000}, mono={0.040000}: dequeue: seq=59 ts=1940 enqueued=2
sys={0.040000}, mono={0.040000}: dequeue: seq=60 ts=2100 enqueued=1
sys={0.040000}, mono={0.040000}: dequeue: seq=61 ts=2260 enqueued=0
+===test_output_seqnum_wraparound===
+sys={0.000000}, mono={0.000000}: clock_override_set
+sys={0.000000}, mono={0.000000}: Sending osmux frame with seqnum=0
+sys={0.000000}, mono={0.000000}: dequeue: seq=50 ts=500 enqueued=5
+sys={0.040000}, mono={0.040000}: clock_override_add
+sys={0.040000}, mono={0.040000}: dequeue: seq=51 ts=660 enqueued=4
+sys={0.040000}, mono={0.040000}: dequeue: seq=52 ts=820 enqueued=3
+sys={0.040000}, mono={0.040000}: flushing other RTP packets
+sys={0.040000}, mono={0.040000}: dequeue: seq=53 ts=980 enqueued=2
+sys={0.040000}, mono={0.040000}: dequeue: seq=54 ts=1140 enqueued=1
+sys={0.040000}, mono={0.040000}: dequeue: seq=55 ts=1300 enqueued=0
OK: Test passed
diff --git a/tests/osmux/osmux_test.c b/tests/osmux/osmux_test.c
index f0edeab..f80902d 100644
--- a/tests/osmux/osmux_test.c
+++ b/tests/osmux/osmux_test.c
@@ -1,6 +1,7 @@
/*
* (C) 2013 by Pablo Neira Ayuso <pablo@gnumonks.org>
* (C) 2013 by On Waves ehf <http://www.on-waves.com>
+ * (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -8,8 +9,6 @@
* (at your option) any later version.
*/
-#define OSMUX_TEST_USE_TIMING 0
-
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
@@ -17,9 +16,6 @@
#include <string.h>
#include <signal.h>
#include <arpa/inet.h>
-#if OSMUX_TEST_USE_TIMING
-#include <sys/time.h>
-#endif
#include <osmocom/core/select.h>
#include <osmocom/core/application.h>
@@ -59,9 +55,6 @@ static uint8_t rtp_pkt[] = {
static int rtp_pkts;
static int mark_pkts;
-#if OSMUX_TEST_USE_TIMING
-static struct timeval last;
-#endif
#define clock_debug(fmt, args...) \
do { \
@@ -92,20 +85,6 @@ static void tx_cb(struct msgb *msg, void *data)
{
struct rtp_hdr *rtph = (struct rtp_hdr *)msg->data;
char buf[4096];
-#if OSMUX_TEST_USE_TIMING
- struct timeval now, diff;
-
- osmo_gettimeofday(&now, NULL);
- timersub(&now, &last, &diff);
- last = now;
-
- if (diff.tv_usec > 2*17000) {
- clock_debug("delivery of reconstructed RTP lagged"
- " (diff.tv_usec=%u > 2*17000)\n",
- (unsigned int)diff.tv_usec);
- exit(EXIT_FAILURE);
- }
-#endif
osmo_rtp_snprintf(buf, sizeof(buf), msg);
clock_debug("extracted packet: %s\n", buf);
@@ -123,7 +102,7 @@ static void tx_cb(struct msgb *msg, void *data)
msgb_free(msg);
}
-static struct osmux_out_handle h_output;
+static struct osmux_out_handle *h_output[4];
static void osmux_deliver(struct msgb *batch_msg, void *data)
{
@@ -137,15 +116,11 @@ static void osmux_deliver(struct msgb *batch_msg, void *data)
* in a list. Then, reconstruct transmission timing.
*/
while((osmuxh = osmux_xfrm_output_pull(batch_msg)) != NULL)
- osmux_xfrm_output_sched(&h_output, osmuxh);
+ osmux_xfrm_output_sched(h_output[osmuxh->circuit_id], osmuxh);
msgb_free(batch_msg);
}
-struct osmux_in_handle h_input = {
- .osmux_seq = 0, /* sequence number to start OSmux message from */
- .batch_factor = 4, /* batch up to 4 RTP messages */
- .deliver = osmux_deliver,
-};
+struct osmux_in_handle *h_input;
static void sigalarm_handler(int foo)
{
@@ -153,7 +128,8 @@ static void sigalarm_handler(int foo)
exit(EXIT_FAILURE);
}
-static void osmux_test_marker(int ccid) {
+static void osmux_test_marker(int num_ccid)
+{
struct msgb *msg;
struct rtp_hdr *rtph = (struct rtp_hdr *)rtp_pkt;
struct rtp_hdr *cpy_rtph;
@@ -166,7 +142,7 @@ static void osmux_test_marker(int ccid) {
seq++;
rtph->sequence = htons(seq);
- for (j=0; j<4; j++) {
+ for (j = 0; j < num_ccid; j++) {
msg = msgb_alloc(1500, "test");
if (!msg)
exit(EXIT_FAILURE);
@@ -181,19 +157,15 @@ static void osmux_test_marker(int ccid) {
}
rtp_pkts++;
- while (osmux_xfrm_input(&h_input, msg, j + ccid) > 0) {
- osmux_xfrm_input_deliver(&h_input);
+ while (osmux_xfrm_input(h_input, msg, j) > 0) {
+ osmux_xfrm_input_deliver(h_input);
}
}
-#if !OSMUX_TEST_USE_TIMING
clock_override_add(0, PKT_TIME_USEC);
-#endif
}
while (rtp_pkts) {
-#if !OSMUX_TEST_USE_TIMING
clock_override_add(1, 0);
-#endif
osmo_select_main(0);
}
@@ -239,17 +211,13 @@ static void osmux_test_loop(int ccid)
* gaps between two messages to test the osmux replaying
* feature.
*/
- osmux_xfrm_input(&h_input, msg, (i % 2) + ccid);
+ osmux_xfrm_input(h_input, msg, (i % 2) + ccid);
if (i % 4 == 0) {
-#if OSMUX_TEST_USE_TIMING
- osmo_gettimeofday(&last, NULL);
-#endif
-
/* After four RTP messages, squash them into the OSMUX
* batch and call the routine to deliver it.
*/
- osmux_xfrm_input_deliver(&h_input);
+ osmux_xfrm_input_deliver(h_input);
/* The first two RTP message (one per circuit ID batch)
* are delivered immediately, wait until the three RTP
@@ -258,9 +226,7 @@ static void osmux_test_loop(int ccid)
*/
for (j = 0; j < k-2; j++) {
osmo_select_main(0);
-#if !OSMUX_TEST_USE_TIMING
clock_override_add(0, PKT_TIME_USEC);
-#endif
}
k = 0;
@@ -282,11 +248,9 @@ int main(void)
exit(EXIT_FAILURE);
}
-#if !OSMUX_TEST_USE_TIMING
/* This test uses fake time to speedup the run, unless we want to manually
* test time specific stuff */
clock_override_enable(true);
-#endif
/* This test doesn't use it, but osmux requires it internally. */
void *tall_ctx = talloc_named_const(NULL, 1, "Root context");
@@ -298,34 +262,45 @@ int main(void)
log_set_print_category_hex(osmo_stderr_target, 0);
log_set_use_color(osmo_stderr_target, 0);
- osmux_xfrm_output_init2(&h_output, 0x7000000, 98);
- osmux_xfrm_output_set_tx_cb(&h_output, tx_cb, NULL);
- /* These fields are set using random() */
- h_output.rtp_seq = 9158;
- h_output.rtp_timestamp = 1681692777;
+ for (i = 0; i < ARRAY_SIZE(h_output); i++) {
+ h_output[i] = osmux_xfrm_output_alloc(NULL);
+ osmux_xfrm_output_set_rtp_ssrc(h_output[i], 0x7000000 + i);
+ osmux_xfrm_output_set_rtp_pl_type(h_output[i], 98);
+ osmux_xfrm_output_set_tx_cb(h_output[i], tx_cb, NULL);
+ /* These fields are set using random() */
+ h_output[i]->rtp_seq = 9158;
+ h_output[i]->rtp_timestamp = 1681692777;
+ }
/* If the test takes longer than 10 seconds, abort it */
alarm(10);
-#if !OSMUX_TEST_USE_TIMING
/* Check if marker bit features work correctly */
- osmux_xfrm_input_init(&h_input);
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_name(h_input, "first");
+ osmux_xfrm_input_set_initial_seqnum(h_input, 0);
+ osmux_xfrm_input_set_batch_factor(h_input, 4);
+ osmux_xfrm_input_set_deliver_cb(h_input, osmux_deliver, NULL);
+
for (i = 0; i < 4; i++)
- osmux_xfrm_input_open_circuit(&h_input, i, 0);
- osmux_test_marker(0);
+ osmux_xfrm_input_open_circuit(h_input, i, 0);
+ osmux_test_marker(4);
for (i = 0; i < 4; i++)
- osmux_xfrm_input_close_circuit(&h_input, i);
- osmux_xfrm_input_fini(&h_input);
-#endif
+ osmux_xfrm_input_close_circuit(h_input, i);
+ TALLOC_FREE(h_input);
- osmux_xfrm_input_init(&h_input);
+ h_input = osmux_xfrm_input_alloc(tall_ctx);
+ osmux_xfrm_input_set_name(h_input, "second");
+ osmux_xfrm_input_set_initial_seqnum(h_input, 0);
+ osmux_xfrm_input_set_batch_factor(h_input, 4);
+ osmux_xfrm_input_set_deliver_cb(h_input, osmux_deliver, NULL);
for (i = 0; i < 2; i++)
- osmux_xfrm_input_open_circuit(&h_input, i, 0);
+ osmux_xfrm_input_open_circuit(h_input, i, 0);
/* Add two circuits with dummy padding */
- osmux_xfrm_input_open_circuit(&h_input, 2, 1);
- osmux_xfrm_input_open_circuit(&h_input, 3, 1);
+ osmux_xfrm_input_open_circuit(h_input, 2, 1);
+ osmux_xfrm_input_open_circuit(h_input, 3, 1);
/* Wait 10 times to make sure dummy padding timer works fine */
for (i = 0; i < 10; i++)
@@ -339,16 +314,25 @@ int main(void)
osmux_test_loop(2);
for (i = 0; i < 4; i++)
- osmux_xfrm_input_close_circuit(&h_input, i);
+ osmux_xfrm_input_close_circuit(h_input, i);
/* Reopen with two circuits and retest */
- osmux_xfrm_input_open_circuit(&h_input, 0, 0);
- osmux_xfrm_input_open_circuit(&h_input, 1, 1);
+ osmux_xfrm_input_open_circuit(h_input, 0, 0);
+ osmux_xfrm_input_open_circuit(h_input, 1, 1);
osmux_test_loop(0);
- osmux_xfrm_input_close_circuit(&h_input, 0);
- osmux_xfrm_input_close_circuit(&h_input, 1);
+ osmux_xfrm_input_close_circuit(h_input, 0);
+ osmux_xfrm_input_close_circuit(h_input, 1);
+
+ TALLOC_FREE(h_input);
- osmux_xfrm_input_fini(&h_input);
+ for (i = 0; i < ARRAY_SIZE(h_output); i++) {
+ clock_debug("Flushing CID %u\n", i);
+ osmux_xfrm_output_flush(h_output[i]);
+ }
+
+ for (i = 0; i < ARRAY_SIZE(h_output); i++) {
+ TALLOC_FREE(h_output[i]);
+ }
clock_debug("OK: Test passed\n");
return EXIT_SUCCESS;
diff --git a/tests/osmux/osmux_test.ok b/tests/osmux/osmux_test.ok
index bd1b066..3c1272f 100644
--- a/tests/osmux/osmux_test.ok
+++ b/tests/osmux/osmux_test.ok
@@ -1,122 +1,318 @@
-DLMUX initialized osmux input converter
+DLMUX [input-0,0/1472] Initialized osmux input converter
+DLMUX [first,0/1472][CID=0,batched=0/4] Circuit opened successfully
+DLMUX [first,0/1472][CID=1,batched=0/4] Circuit opened successfully
+DLMUX [first,0/1472][CID=2,batched=0/4] Circuit opened successfully
+DLMUX [first,0/1472][CID=3,batched=0/4] Circuit opened successfully
sys={23.444242}, mono={0.020000}: clock_override_add
sys={23.464242}, mono={0.040000}: clock_override_add
sys={23.484242}, mono={0.060000}: clock_override_add
sys={23.504242}, mono={0.080000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={23.504242}, mono={0.080000}: OSMUX message (len=256): OSMUX seq=000 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=002 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={23.504242}, mono={0.080000}: OSMUX message (len=256): OSMUX seq=000 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=001 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=003 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.504242}, mono={0.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9158 timestamp=1681692777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.504242}, mono={0.080000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9158 timestamp=1681692777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.504242}, mono={0.080000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9158 timestamp=1681692777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.504242}, mono={0.080000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9158 timestamp=1681692777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.524242}, mono={0.100000}: clock_override_add
-sys={23.524242}, mono={0.100000}: OSMUX message (len=106): OSMUX seq=004 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=006 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.524242}, mono={0.100000}: OSMUX message (len=106): OSMUX seq=001 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.544242}, mono={0.120000}: clock_override_add
sys={23.564242}, mono={0.140000}: clock_override_add
-sys={23.564242}, mono={0.140000}: OSMUX message (len=106): OSMUX seq=008 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=010 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.564242}, mono={0.140000}: OSMUX message (len=106): OSMUX seq=002 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=002 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=002 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=002 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.584242}, mono={0.160000}: clock_override_add
sys={23.604242}, mono={0.180000}: clock_override_add
sys={23.624242}, mono={0.200000}: clock_override_add
sys={23.644242}, mono={0.220000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={23.644242}, mono={0.220000}: OSMUX message (len=256): OSMUX seq=012 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=014 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={23.644242}, mono={0.220000}: OSMUX message (len=256): OSMUX seq=003 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.664242}, mono={0.240000}: clock_override_add
-sys={23.664242}, mono={0.240000}: OSMUX message (len=106): OSMUX seq=016 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=017 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=018 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=019 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.664242}, mono={0.240000}: OSMUX message (len=106): OSMUX seq=004 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=004 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=004 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=004 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.684242}, mono={0.260000}: clock_override_add
sys={23.704242}, mono={0.280000}: clock_override_add
-sys={23.704242}, mono={0.280000}: OSMUX message (len=106): OSMUX seq=020 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=021 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=022 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=023 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.704242}, mono={0.280000}: OSMUX message (len=106): OSMUX seq=005 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.724242}, mono={0.300000}: clock_override_add
sys={23.744242}, mono={0.320000}: clock_override_add
sys={23.764242}, mono={0.340000}: clock_override_add
sys={23.784242}, mono={0.360000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={23.784242}, mono={0.360000}: OSMUX message (len=256): OSMUX seq=024 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=025 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=026 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=027 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={23.784242}, mono={0.360000}: OSMUX message (len=256): OSMUX seq=006 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=006 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=006 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=006 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.804242}, mono={0.380000}: clock_override_add
-sys={23.804242}, mono={0.380000}: OSMUX message (len=106): OSMUX seq=028 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=029 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=030 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=031 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.804242}, mono={0.380000}: OSMUX message (len=106): OSMUX seq=007 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.824242}, mono={0.400000}: clock_override_add
sys={23.844242}, mono={0.420000}: clock_override_add
-sys={23.844242}, mono={0.420000}: OSMUX message (len=106): OSMUX seq=032 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=033 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=034 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=035 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.844242}, mono={0.420000}: OSMUX message (len=106): OSMUX seq=008 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=008 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=008 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=008 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.864242}, mono={0.440000}: clock_override_add
sys={23.884242}, mono={0.460000}: clock_override_add
sys={23.904242}, mono={0.480000}: clock_override_add
sys={23.924242}, mono={0.500000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={23.924242}, mono={0.500000}: OSMUX message (len=256): OSMUX seq=036 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=037 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=038 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=039 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={23.924242}, mono={0.500000}: OSMUX message (len=256): OSMUX seq=009 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.944242}, mono={0.520000}: clock_override_add
-sys={23.944242}, mono={0.520000}: OSMUX message (len=106): OSMUX seq=040 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=041 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=042 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=043 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.944242}, mono={0.520000}: OSMUX message (len=106): OSMUX seq=010 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=010 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=010 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=010 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={23.964242}, mono={0.540000}: clock_override_add
sys={23.984242}, mono={0.560000}: clock_override_add
-sys={23.984242}, mono={0.560000}: OSMUX message (len=106): OSMUX seq=044 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=045 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=046 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=047 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={23.984242}, mono={0.560000}: OSMUX message (len=106): OSMUX seq=011 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.004242}, mono={0.580000}: clock_override_add
sys={24.024242}, mono={0.600000}: clock_override_add
sys={24.044242}, mono={0.620000}: clock_override_add
sys={24.064242}, mono={0.640000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={24.064242}, mono={0.640000}: OSMUX message (len=256): OSMUX seq=048 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=049 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=050 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=051 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={24.064242}, mono={0.640000}: OSMUX message (len=256): OSMUX seq=012 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=012 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=012 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=012 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.084242}, mono={0.660000}: clock_override_add
-sys={24.084242}, mono={0.660000}: OSMUX message (len=106): OSMUX seq=052 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=053 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=054 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=055 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.084242}, mono={0.660000}: OSMUX message (len=106): OSMUX seq=013 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.104242}, mono={0.680000}: clock_override_add
sys={24.124242}, mono={0.700000}: clock_override_add
-sys={24.124242}, mono={0.700000}: OSMUX message (len=106): OSMUX seq=056 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=057 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=058 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=059 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.124242}, mono={0.700000}: OSMUX message (len=106): OSMUX seq=014 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=014 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=014 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=014 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.144242}, mono={0.720000}: clock_override_add
sys={24.164242}, mono={0.740000}: clock_override_add
sys={24.184242}, mono={0.760000}: clock_override_add
sys={24.204242}, mono={0.780000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={24.204242}, mono={0.780000}: OSMUX message (len=256): OSMUX seq=060 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=061 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=062 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=063 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={24.204242}, mono={0.780000}: OSMUX message (len=256): OSMUX seq=015 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.224242}, mono={0.800000}: clock_override_add
-sys={24.224242}, mono={0.800000}: OSMUX message (len=106): OSMUX seq=064 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=065 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=066 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=067 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.224242}, mono={0.800000}: OSMUX message (len=106): OSMUX seq=016 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=016 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=016 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=016 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.244242}, mono={0.820000}: clock_override_add
sys={24.264242}, mono={0.840000}: clock_override_add
-sys={24.264242}, mono={0.840000}: OSMUX message (len=106): OSMUX seq=068 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=069 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=070 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=071 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.264242}, mono={0.840000}: OSMUX message (len=106): OSMUX seq=017 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=017 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=017 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=017 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.284242}, mono={0.860000}: clock_override_add
sys={24.304242}, mono={0.880000}: clock_override_add
sys={24.324242}, mono={0.900000}: clock_override_add
sys={24.344242}, mono={0.920000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={24.344242}, mono={0.920000}: OSMUX message (len=256): OSMUX seq=072 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=073 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=074 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=075 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={24.344242}, mono={0.920000}: OSMUX message (len=256): OSMUX seq=018 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=018 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=018 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=018 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.364242}, mono={0.940000}: clock_override_add
-sys={24.364242}, mono={0.940000}: OSMUX message (len=106): OSMUX seq=076 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=077 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=078 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=079 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.364242}, mono={0.940000}: OSMUX message (len=106): OSMUX seq=019 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=019 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=019 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=019 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.384242}, mono={0.960000}: clock_override_add
sys={24.404242}, mono={0.980000}: clock_override_add
-sys={24.404242}, mono={0.980000}: OSMUX message (len=106): OSMUX seq=080 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=081 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=082 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=083 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.404242}, mono={0.980000}: OSMUX message (len=106): OSMUX seq=020 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=020 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=020 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=020 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.424242}, mono={1.000000}: clock_override_add
sys={24.444242}, mono={1.020000}: clock_override_add
sys={24.464242}, mono={1.040000}: clock_override_add
sys={24.484242}, mono={1.060000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={24.484242}, mono={1.060000}: OSMUX message (len=256): OSMUX seq=084 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=085 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=086 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=087 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={24.484242}, mono={1.060000}: OSMUX message (len=256): OSMUX seq=021 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=021 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=021 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=021 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.504242}, mono={1.080000}: clock_override_add
-sys={24.504242}, mono={1.080000}: OSMUX message (len=106): OSMUX seq=088 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=089 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=090 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=091 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.504242}, mono={1.080000}: OSMUX message (len=106): OSMUX seq=022 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=022 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=022 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=022 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.524242}, mono={1.100000}: clock_override_add
sys={24.544242}, mono={1.120000}: clock_override_add
-sys={24.544242}, mono={1.120000}: OSMUX message (len=106): OSMUX seq=092 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=093 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=094 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=095 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.544242}, mono={1.120000}: OSMUX message (len=106): OSMUX seq=023 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=023 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=023 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=023 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.564242}, mono={1.140000}: clock_override_add
sys={24.584242}, mono={1.160000}: clock_override_add
sys={24.604242}, mono={1.180000}: clock_override_add
sys={24.624242}, mono={1.200000}: clock_override_add
-DLMUX Batch is full for RTP sssrc=1644169479
-sys={24.624242}, mono={1.200000}: OSMUX message (len=256): OSMUX seq=096 ccid=000 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=097 ccid=001 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=098 ccid=002 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=099 ccid=003 ft=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,256/1472][CID=0,batched=4/4] Batch is full for RTP sssrc=1644169479
+sys={24.624242}, mono={1.200000}: OSMUX message (len=256): OSMUX seq=024 ccid=000 ft=1 rtp_m=1 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=024 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=024 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=024 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.644242}, mono={1.220000}: clock_override_add
-sys={24.644242}, mono={1.220000}: OSMUX message (len=106): OSMUX seq=100 ccid=000 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=101 ccid=001 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=102 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=103 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.644242}, mono={1.220000}: OSMUX message (len=106): OSMUX seq=025 ccid=000 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=025 ccid=001 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=025 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=025 ccid=003 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.664242}, mono={1.240000}: clock_override_add
sys={24.684242}, mono={1.260000}: clock_override_add
-sys={24.684242}, mono={1.260000}: OSMUX message (len=106): OSMUX seq=104 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=105 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=106 ccid=002 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=107 ccid=003 ft=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={24.684242}, mono={1.260000}: OSMUX message (len=106): OSMUX seq=026 ccid=000 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=026 ccid=001 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=026 ccid=002 ft=1 rtp_m=1 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=026 ccid=003 ft=1 rtp_m=0 ctr=1 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={24.704242}, mono={1.280000}: clock_override_add
sys={25.704242}, mono={2.280000}: clock_override_add
-sys={25.704242}, mono={2.280000}: OSMUX message (len=76): OSMUX seq=108 ccid=000 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=109 ccid=001 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=110 ccid=002 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=111 ccid=003 ft=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={25.704242}, mono={2.280000}: OSMUX message (len=76): OSMUX seq=027 ccid=000 ft=1 rtp_m=1 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=027 ccid=001 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=027 ccid=002 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=027 ccid=003 ft=1 rtp_m=0 ctr=0 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: clock_override_add
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9159 timestamp=1681692937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9160 timestamp=1681693097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9161 timestamp=1681693257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9162 timestamp=1681693417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9163 timestamp=1681693577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9164 timestamp=1681693737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9165 timestamp=1681693897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9166 timestamp=1681694057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9167 timestamp=1681694217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9168 timestamp=1681694377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9169 timestamp=1681694537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9170 timestamp=1681694697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9171 timestamp=1681694857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9172 timestamp=1681695017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9173 timestamp=1681695177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9174 timestamp=1681695337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9175 timestamp=1681695497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9176 timestamp=1681695657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9177 timestamp=1681695817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9178 timestamp=1681695977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9179 timestamp=1681696137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9180 timestamp=1681696297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9181 timestamp=1681696457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9182 timestamp=1681696617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9183 timestamp=1681696777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9184 timestamp=1681696937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9185 timestamp=1681697097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9186 timestamp=1681697257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9187 timestamp=1681697417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9188 timestamp=1681697577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9189 timestamp=1681697737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9190 timestamp=1681697897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9191 timestamp=1681698057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9192 timestamp=1681698217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9193 timestamp=1681698377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9194 timestamp=1681698537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9195 timestamp=1681698697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9196 timestamp=1681698857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9197 timestamp=1681699017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9198 timestamp=1681699177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9199 timestamp=1681699337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9200 timestamp=1681699497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9201 timestamp=1681699657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9202 timestamp=1681699817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9203 timestamp=1681699977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9204 timestamp=1681700137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9205 timestamp=1681700297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9206 timestamp=1681700457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9207 timestamp=1681700617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9208 timestamp=1681700777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9209 timestamp=1681700937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9210 timestamp=1681701097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9211 timestamp=1681701257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9212 timestamp=1681701417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9213 timestamp=1681701577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9214 timestamp=1681701737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9215 timestamp=1681701897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9216 timestamp=1681702057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9217 timestamp=1681702217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9218 timestamp=1681702377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9219 timestamp=1681702537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9220 timestamp=1681702697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9221 timestamp=1681702857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9159 timestamp=1681692937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9160 timestamp=1681693097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9161 timestamp=1681693257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9162 timestamp=1681693417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9163 timestamp=1681693577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9164 timestamp=1681693737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9165 timestamp=1681693897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9166 timestamp=1681694057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9167 timestamp=1681694217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9168 timestamp=1681694377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9169 timestamp=1681694537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9170 timestamp=1681694697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9171 timestamp=1681694857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9172 timestamp=1681695017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9173 timestamp=1681695177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9174 timestamp=1681695337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9175 timestamp=1681695497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9176 timestamp=1681695657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9177 timestamp=1681695817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9178 timestamp=1681695977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9179 timestamp=1681696137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9180 timestamp=1681696297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9181 timestamp=1681696457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9182 timestamp=1681696617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9183 timestamp=1681696777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9184 timestamp=1681696937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9185 timestamp=1681697097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9186 timestamp=1681697257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9187 timestamp=1681697417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9188 timestamp=1681697577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9189 timestamp=1681697737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9190 timestamp=1681697897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9191 timestamp=1681698057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9192 timestamp=1681698217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9193 timestamp=1681698377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9194 timestamp=1681698537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9195 timestamp=1681698697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9196 timestamp=1681698857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9197 timestamp=1681699017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9198 timestamp=1681699177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9199 timestamp=1681699337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9200 timestamp=1681699497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9201 timestamp=1681699657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9202 timestamp=1681699817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9203 timestamp=1681699977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9204 timestamp=1681700137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9205 timestamp=1681700297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9206 timestamp=1681700457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9207 timestamp=1681700617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9208 timestamp=1681700777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9209 timestamp=1681700937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9210 timestamp=1681701097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9211 timestamp=1681701257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9212 timestamp=1681701417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9213 timestamp=1681701577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9214 timestamp=1681701737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9215 timestamp=1681701897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9216 timestamp=1681702057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9217 timestamp=1681702217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9218 timestamp=1681702377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9219 timestamp=1681702537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9220 timestamp=1681702697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9221 timestamp=1681702857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9159 timestamp=1681692937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9160 timestamp=1681693097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9161 timestamp=1681693257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9162 timestamp=1681693417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9163 timestamp=1681693577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9164 timestamp=1681693737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9165 timestamp=1681693897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9166 timestamp=1681694057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9167 timestamp=1681694217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9168 timestamp=1681694377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9169 timestamp=1681694537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9170 timestamp=1681694697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9171 timestamp=1681694857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9172 timestamp=1681695017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9173 timestamp=1681695177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9174 timestamp=1681695337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9175 timestamp=1681695497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9176 timestamp=1681695657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9177 timestamp=1681695817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9178 timestamp=1681695977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9179 timestamp=1681696137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9180 timestamp=1681696297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9181 timestamp=1681696457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9182 timestamp=1681696617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9183 timestamp=1681696777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9184 timestamp=1681696937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9185 timestamp=1681697097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9186 timestamp=1681697257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9187 timestamp=1681697417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9188 timestamp=1681697577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9189 timestamp=1681697737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9190 timestamp=1681697897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9191 timestamp=1681698057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9192 timestamp=1681698217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9193 timestamp=1681698377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9194 timestamp=1681698537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9195 timestamp=1681698697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9196 timestamp=1681698857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9197 timestamp=1681699017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9198 timestamp=1681699177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9199 timestamp=1681699337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9200 timestamp=1681699497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9201 timestamp=1681699657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9202 timestamp=1681699817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9203 timestamp=1681699977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9204 timestamp=1681700137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9205 timestamp=1681700297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9206 timestamp=1681700457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9207 timestamp=1681700617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9208 timestamp=1681700777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9209 timestamp=1681700937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9210 timestamp=1681701097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9211 timestamp=1681701257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9212 timestamp=1681701417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9213 timestamp=1681701577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9214 timestamp=1681701737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9215 timestamp=1681701897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9216 timestamp=1681702057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9217 timestamp=1681702217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9218 timestamp=1681702377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9219 timestamp=1681702537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9220 timestamp=1681702697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9221 timestamp=1681702857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9159 timestamp=1681692937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9160 timestamp=1681693097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9161 timestamp=1681693257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9162 timestamp=1681693417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9162 timestamp=1681693417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9163 timestamp=1681693577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9164 timestamp=1681693737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9165 timestamp=1681693897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9166 timestamp=1681694057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9165 timestamp=1681693897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9166 timestamp=1681694057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9167 timestamp=1681694217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9168 timestamp=1681694377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9169 timestamp=1681694537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9170 timestamp=1681694697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9170 timestamp=1681694697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9171 timestamp=1681694857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9172 timestamp=1681695017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9172 timestamp=1681695017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9173 timestamp=1681695177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9174 timestamp=1681695337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9175 timestamp=1681695497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
@@ -125,8 +321,8 @@ sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 typ
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9178 timestamp=1681695977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9179 timestamp=1681696137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9180 timestamp=1681696297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9181 timestamp=1681696457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9182 timestamp=1681696617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9181 timestamp=1681696457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9182 timestamp=1681696617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9183 timestamp=1681696777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9184 timestamp=1681696937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9185 timestamp=1681697097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
@@ -137,14 +333,14 @@ sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 typ
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9190 timestamp=1681697897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9191 timestamp=1681698057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9192 timestamp=1681698217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9193 timestamp=1681698377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9193 timestamp=1681698377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9194 timestamp=1681698537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9195 timestamp=1681698697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9196 timestamp=1681698857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9197 timestamp=1681699017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9198 timestamp=1681699177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9199 timestamp=1681699337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9200 timestamp=1681699497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9200 timestamp=1681699497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9201 timestamp=1681699657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9202 timestamp=1681699817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9203 timestamp=1681699977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
@@ -153,8 +349,8 @@ sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 typ
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9206 timestamp=1681700457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9207 timestamp=1681700617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9208 timestamp=1681700777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9209 timestamp=1681700937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9210 timestamp=1681701097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9209 timestamp=1681700937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9210 timestamp=1681701097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9211 timestamp=1681701257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9212 timestamp=1681701417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9213 timestamp=1681701577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
@@ -165,917 +361,926 @@ sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 typ
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9218 timestamp=1681702377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9219 timestamp=1681702537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9220 timestamp=1681702697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9221 timestamp=1681702857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9222 timestamp=1681703017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9223 timestamp=1681703177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9224 timestamp=1681703337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9225 timestamp=1681703497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9226 timestamp=1681703657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9227 timestamp=1681703817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9228 timestamp=1681703977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9229 timestamp=1681704137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9230 timestamp=1681704297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9231 timestamp=1681704457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9232 timestamp=1681704617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9233 timestamp=1681704777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9234 timestamp=1681704937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9235 timestamp=1681705097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9236 timestamp=1681705257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9237 timestamp=1681705417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9238 timestamp=1681705577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9239 timestamp=1681705737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9240 timestamp=1681705897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9241 timestamp=1681706057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9242 timestamp=1681706217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9243 timestamp=1681706377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9244 timestamp=1681706537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9245 timestamp=1681706697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9246 timestamp=1681706857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9247 timestamp=1681707017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9248 timestamp=1681707177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9249 timestamp=1681707337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9250 timestamp=1681707497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9251 timestamp=1681707657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9252 timestamp=1681707817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9253 timestamp=1681707977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9254 timestamp=1681708137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9255 timestamp=1681708297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9256 timestamp=1681708457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9257 timestamp=1681708617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9258 timestamp=1681708777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9259 timestamp=1681708937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9260 timestamp=1681709097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9261 timestamp=1681709257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9262 timestamp=1681709417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9263 timestamp=1681709577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9264 timestamp=1681709737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9265 timestamp=1681709897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9266 timestamp=1681710057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9267 timestamp=1681710217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9268 timestamp=1681710377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9269 timestamp=1681710537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9270 timestamp=1681710697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9271 timestamp=1681710857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9272 timestamp=1681711017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9273 timestamp=1681711177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9274 timestamp=1681711337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9275 timestamp=1681711497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9276 timestamp=1681711657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9277 timestamp=1681711817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9278 timestamp=1681711977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9279 timestamp=1681712137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9280 timestamp=1681712297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9281 timestamp=1681712457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9282 timestamp=1681712617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9283 timestamp=1681712777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9284 timestamp=1681712937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9285 timestamp=1681713097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9286 timestamp=1681713257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9287 timestamp=1681713417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9288 timestamp=1681713577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9289 timestamp=1681713737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9290 timestamp=1681713897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9291 timestamp=1681714057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9292 timestamp=1681714217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9293 timestamp=1681714377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9294 timestamp=1681714537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9295 timestamp=1681714697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9296 timestamp=1681714857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9297 timestamp=1681715017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9298 timestamp=1681715177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9299 timestamp=1681715337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9300 timestamp=1681715497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9301 timestamp=1681715657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9302 timestamp=1681715817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9303 timestamp=1681715977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9304 timestamp=1681716137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9305 timestamp=1681716297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9306 timestamp=1681716457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9307 timestamp=1681716617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9308 timestamp=1681716777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9309 timestamp=1681716937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9310 timestamp=1681717097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9311 timestamp=1681717257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9312 timestamp=1681717417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9313 timestamp=1681717577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9314 timestamp=1681717737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9315 timestamp=1681717897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9316 timestamp=1681718057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9317 timestamp=1681718217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9318 timestamp=1681718377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9319 timestamp=1681718537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9320 timestamp=1681718697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9321 timestamp=1681718857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9322 timestamp=1681719017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9323 timestamp=1681719177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9324 timestamp=1681719337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9325 timestamp=1681719497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9326 timestamp=1681719657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9327 timestamp=1681719817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9328 timestamp=1681719977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9329 timestamp=1681720137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9330 timestamp=1681720297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9331 timestamp=1681720457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9332 timestamp=1681720617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9333 timestamp=1681720777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9334 timestamp=1681720937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9335 timestamp=1681721097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9336 timestamp=1681721257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9337 timestamp=1681721417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9338 timestamp=1681721577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9339 timestamp=1681721737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9340 timestamp=1681721897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9341 timestamp=1681722057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9342 timestamp=1681722217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9343 timestamp=1681722377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9344 timestamp=1681722537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9345 timestamp=1681722697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9346 timestamp=1681722857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9347 timestamp=1681723017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9348 timestamp=1681723177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9349 timestamp=1681723337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9350 timestamp=1681723497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9351 timestamp=1681723657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9352 timestamp=1681723817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9353 timestamp=1681723977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9354 timestamp=1681724137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9355 timestamp=1681724297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9356 timestamp=1681724457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9357 timestamp=1681724617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9358 timestamp=1681724777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9359 timestamp=1681724937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9360 timestamp=1681725097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9361 timestamp=1681725257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9362 timestamp=1681725417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9363 timestamp=1681725577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9364 timestamp=1681725737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9365 timestamp=1681725897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9366 timestamp=1681726057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9367 timestamp=1681726217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9368 timestamp=1681726377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9369 timestamp=1681726537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9370 timestamp=1681726697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9371 timestamp=1681726857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9372 timestamp=1681727017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9373 timestamp=1681727177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9374 timestamp=1681727337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9375 timestamp=1681727497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9376 timestamp=1681727657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9377 timestamp=1681727817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9378 timestamp=1681727977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9379 timestamp=1681728137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9380 timestamp=1681728297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9381 timestamp=1681728457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9382 timestamp=1681728617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9383 timestamp=1681728777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9384 timestamp=1681728937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9385 timestamp=1681729097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9386 timestamp=1681729257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9387 timestamp=1681729417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9388 timestamp=1681729577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9389 timestamp=1681729737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9390 timestamp=1681729897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9391 timestamp=1681730057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9392 timestamp=1681730217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9393 timestamp=1681730377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9394 timestamp=1681730537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9395 timestamp=1681730697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9396 timestamp=1681730857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9397 timestamp=1681731017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9398 timestamp=1681731177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9399 timestamp=1681731337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9400 timestamp=1681731497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9401 timestamp=1681731657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9402 timestamp=1681731817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9403 timestamp=1681731977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9404 timestamp=1681732137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9405 timestamp=1681732297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9406 timestamp=1681732457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9407 timestamp=1681732617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9408 timestamp=1681732777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9409 timestamp=1681732937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9410 timestamp=1681733097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9411 timestamp=1681733257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9412 timestamp=1681733417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9413 timestamp=1681733577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX initialized osmux input converter
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9221 timestamp=1681702857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [first,0/1472][CID=0,batched=0/4] Closing circuit
+DLMUX [first,0/1472][CID=1,batched=0/4] Closing circuit
+DLMUX [first,0/1472][CID=2,batched=0/4] Closing circuit
+DLMUX [first,0/1472][CID=3,batched=0/4] Closing circuit
+DLMUX [input-1,0/1472] Initialized osmux input converter
+DLMUX [second,0/1472][CID=0,batched=0/4] Circuit opened successfully
+DLMUX [second,0/1472][CID=1,batched=0/4] Circuit opened successfully
+DLMUX [second,0/1472][CID=2,batched=0/4] Circuit opened successfully
+DLMUX [second,0/1472][CID=3,batched=0/4] Circuit opened successfully
sys={26.704242}, mono={3.280000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=1 ext=0 csrc_count=0 sequence=16396 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=1 ext=0 csrc_count=0 sequence=16397 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.704242}, mono={3.280000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16398 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,38/1472][CID=1,batched=1/4] RTP seq jump detected: 16396 -> 16398 (1 lost packets)
sys={26.704242}, mono={3.280000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16399 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.704242}, mono={3.280000}: OSMUX message (len=242): OSMUX seq=000 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9414 timestamp=1681733737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9415 timestamp=1681733897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9416 timestamp=1681734057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9417 timestamp=1681734217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,68/1472][CID=0,batched=1/4] RTP seq jump detected: 16397 -> 16399 (1 lost packets)
+sys={26.704242}, mono={3.280000}: OSMUX message (len=242): OSMUX seq=000 ccid=000 ft=1 rtp_m=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=001 ft=1 rtp_m=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9222 timestamp=1681703017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.704242}, mono={3.280000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9222 timestamp=1681703017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.724242}, mono={3.300000}: clock_override_add
-sys={26.724242}, mono={3.300000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9418 timestamp=1681734377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.724242}, mono={3.300000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9223 timestamp=1681703177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.724242}, mono={3.300000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9223 timestamp=1681703177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.744242}, mono={3.320000}: clock_override_add
sys={26.744242}, mono={3.320000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16400 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16398 -> 16400 (1 lost packets)
sys={26.744242}, mono={3.320000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16401 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16399 -> 16401 (1 lost packets)
sys={26.744242}, mono={3.320000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16402 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16400 -> 16402 (1 lost packets)
sys={26.744242}, mono={3.320000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16403 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.744242}, mono={3.320000}: OSMUX message (len=242): OSMUX seq=002 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9419 timestamp=1681734537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9420 timestamp=1681734697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9421 timestamp=1681734857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9422 timestamp=1681735017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9423 timestamp=1681735177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16401 -> 16403 (1 lost packets)
+sys={26.744242}, mono={3.320000}: OSMUX message (len=272): OSMUX seq=001 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9224 timestamp=1681703337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9225 timestamp=1681703497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9224 timestamp=1681703337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.744242}, mono={3.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9225 timestamp=1681703497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.764242}, mono={3.340000}: clock_override_add
-sys={26.764242}, mono={3.340000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9424 timestamp=1681735337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.764242}, mono={3.340000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9226 timestamp=1681703657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.764242}, mono={3.340000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9226 timestamp=1681703657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.784242}, mono={3.360000}: clock_override_add
sys={26.784242}, mono={3.360000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16404 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16402 -> 16404 (1 lost packets)
sys={26.784242}, mono={3.360000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16405 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16403 -> 16405 (1 lost packets)
sys={26.784242}, mono={3.360000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16406 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16404 -> 16406 (1 lost packets)
sys={26.784242}, mono={3.360000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16407 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.784242}, mono={3.360000}: OSMUX message (len=242): OSMUX seq=004 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9425 timestamp=1681735497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9426 timestamp=1681735657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9427 timestamp=1681735817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9428 timestamp=1681735977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9429 timestamp=1681736137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16405 -> 16407 (1 lost packets)
+sys={26.784242}, mono={3.360000}: OSMUX message (len=272): OSMUX seq=002 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=002 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9227 timestamp=1681703817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9228 timestamp=1681703977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9229 timestamp=1681704137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9227 timestamp=1681703817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9228 timestamp=1681703977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.784242}, mono={3.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9229 timestamp=1681704137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.804242}, mono={3.380000}: clock_override_add
-sys={26.804242}, mono={3.380000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9430 timestamp=1681736297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.804242}, mono={3.380000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9230 timestamp=1681704297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.804242}, mono={3.380000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9230 timestamp=1681704297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.824242}, mono={3.400000}: clock_override_add
sys={26.824242}, mono={3.400000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16408 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16406 -> 16408 (1 lost packets)
sys={26.824242}, mono={3.400000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16409 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16407 -> 16409 (1 lost packets)
sys={26.824242}, mono={3.400000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16410 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16408 -> 16410 (1 lost packets)
sys={26.824242}, mono={3.400000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16411 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.824242}, mono={3.400000}: OSMUX message (len=242): OSMUX seq=006 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9431 timestamp=1681736457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9432 timestamp=1681736617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9433 timestamp=1681736777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9434 timestamp=1681736937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9435 timestamp=1681737097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16409 -> 16411 (1 lost packets)
+sys={26.824242}, mono={3.400000}: OSMUX message (len=272): OSMUX seq=003 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9231 timestamp=1681704457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9232 timestamp=1681704617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9233 timestamp=1681704777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9231 timestamp=1681704457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9232 timestamp=1681704617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.824242}, mono={3.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9233 timestamp=1681704777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.844242}, mono={3.420000}: clock_override_add
-sys={26.844242}, mono={3.420000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9436 timestamp=1681737257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.844242}, mono={3.420000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9234 timestamp=1681704937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.844242}, mono={3.420000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9234 timestamp=1681704937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.864242}, mono={3.440000}: clock_override_add
sys={26.864242}, mono={3.440000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16412 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16410 -> 16412 (1 lost packets)
sys={26.864242}, mono={3.440000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16413 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16411 -> 16413 (1 lost packets)
sys={26.864242}, mono={3.440000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16414 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16412 -> 16414 (1 lost packets)
sys={26.864242}, mono={3.440000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16415 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.864242}, mono={3.440000}: OSMUX message (len=242): OSMUX seq=008 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9437 timestamp=1681737417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9438 timestamp=1681737577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9439 timestamp=1681737737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9440 timestamp=1681737897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9441 timestamp=1681738057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16413 -> 16415 (1 lost packets)
+sys={26.864242}, mono={3.440000}: OSMUX message (len=272): OSMUX seq=004 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=004 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9235 timestamp=1681705097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9236 timestamp=1681705257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9237 timestamp=1681705417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9235 timestamp=1681705097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9236 timestamp=1681705257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.864242}, mono={3.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9237 timestamp=1681705417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.884242}, mono={3.460000}: clock_override_add
-sys={26.884242}, mono={3.460000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9442 timestamp=1681738217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.884242}, mono={3.460000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9238 timestamp=1681705577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.884242}, mono={3.460000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9238 timestamp=1681705577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.904242}, mono={3.480000}: clock_override_add
sys={26.904242}, mono={3.480000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16416 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16414 -> 16416 (1 lost packets)
sys={26.904242}, mono={3.480000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16417 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16415 -> 16417 (1 lost packets)
sys={26.904242}, mono={3.480000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16418 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16416 -> 16418 (1 lost packets)
sys={26.904242}, mono={3.480000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16419 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.904242}, mono={3.480000}: OSMUX message (len=242): OSMUX seq=010 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9443 timestamp=1681738377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9444 timestamp=1681738537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9445 timestamp=1681738697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9446 timestamp=1681738857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9447 timestamp=1681739017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16417 -> 16419 (1 lost packets)
+sys={26.904242}, mono={3.480000}: OSMUX message (len=272): OSMUX seq=005 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9239 timestamp=1681705737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9240 timestamp=1681705897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9241 timestamp=1681706057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9239 timestamp=1681705737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9240 timestamp=1681705897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.904242}, mono={3.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9241 timestamp=1681706057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.924242}, mono={3.500000}: clock_override_add
-sys={26.924242}, mono={3.500000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9448 timestamp=1681739177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.924242}, mono={3.500000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9242 timestamp=1681706217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.924242}, mono={3.500000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9242 timestamp=1681706217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.944242}, mono={3.520000}: clock_override_add
sys={26.944242}, mono={3.520000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16420 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16418 -> 16420 (1 lost packets)
sys={26.944242}, mono={3.520000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16421 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16419 -> 16421 (1 lost packets)
sys={26.944242}, mono={3.520000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16422 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16420 -> 16422 (1 lost packets)
sys={26.944242}, mono={3.520000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16423 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.944242}, mono={3.520000}: OSMUX message (len=242): OSMUX seq=012 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9449 timestamp=1681739337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9450 timestamp=1681739497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9451 timestamp=1681739657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9452 timestamp=1681739817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9453 timestamp=1681739977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16421 -> 16423 (1 lost packets)
+sys={26.944242}, mono={3.520000}: OSMUX message (len=272): OSMUX seq=006 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=006 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9243 timestamp=1681706377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9244 timestamp=1681706537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9245 timestamp=1681706697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9243 timestamp=1681706377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9244 timestamp=1681706537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.944242}, mono={3.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9245 timestamp=1681706697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.964242}, mono={3.540000}: clock_override_add
-sys={26.964242}, mono={3.540000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9454 timestamp=1681740137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.964242}, mono={3.540000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9246 timestamp=1681706857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.964242}, mono={3.540000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9246 timestamp=1681706857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={26.984242}, mono={3.560000}: clock_override_add
sys={26.984242}, mono={3.560000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16424 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16422 -> 16424 (1 lost packets)
sys={26.984242}, mono={3.560000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16425 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16423 -> 16425 (1 lost packets)
sys={26.984242}, mono={3.560000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16426 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16424 -> 16426 (1 lost packets)
sys={26.984242}, mono={3.560000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16427 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={26.984242}, mono={3.560000}: OSMUX message (len=242): OSMUX seq=014 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9455 timestamp=1681740297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9456 timestamp=1681740457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9457 timestamp=1681740617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9458 timestamp=1681740777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9459 timestamp=1681740937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16425 -> 16427 (1 lost packets)
+sys={26.984242}, mono={3.560000}: OSMUX message (len=272): OSMUX seq=007 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9247 timestamp=1681707017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9248 timestamp=1681707177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9249 timestamp=1681707337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9247 timestamp=1681707017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9248 timestamp=1681707177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={26.984242}, mono={3.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9249 timestamp=1681707337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.004242}, mono={3.580000}: clock_override_add
-sys={27.004242}, mono={3.580000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9460 timestamp=1681741097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.004242}, mono={3.580000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9250 timestamp=1681707497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.004242}, mono={3.580000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9250 timestamp=1681707497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.024242}, mono={3.600000}: clock_override_add
sys={27.024242}, mono={3.600000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16428 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16426 -> 16428 (1 lost packets)
sys={27.024242}, mono={3.600000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16429 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16427 -> 16429 (1 lost packets)
sys={27.024242}, mono={3.600000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16430 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16428 -> 16430 (1 lost packets)
sys={27.024242}, mono={3.600000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16431 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.024242}, mono={3.600000}: OSMUX message (len=242): OSMUX seq=016 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=017 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9461 timestamp=1681741257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9462 timestamp=1681741417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9463 timestamp=1681741577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9464 timestamp=1681741737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9465 timestamp=1681741897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16429 -> 16431 (1 lost packets)
+sys={27.024242}, mono={3.600000}: OSMUX message (len=272): OSMUX seq=008 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=008 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9251 timestamp=1681707657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9252 timestamp=1681707817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9253 timestamp=1681707977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9251 timestamp=1681707657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9252 timestamp=1681707817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.024242}, mono={3.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9253 timestamp=1681707977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.044242}, mono={3.620000}: clock_override_add
-sys={27.044242}, mono={3.620000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9466 timestamp=1681742057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.044242}, mono={3.620000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9254 timestamp=1681708137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.044242}, mono={3.620000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9254 timestamp=1681708137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.064242}, mono={3.640000}: clock_override_add
sys={27.064242}, mono={3.640000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16432 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16430 -> 16432 (1 lost packets)
sys={27.064242}, mono={3.640000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16433 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16431 -> 16433 (1 lost packets)
sys={27.064242}, mono={3.640000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16434 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16432 -> 16434 (1 lost packets)
sys={27.064242}, mono={3.640000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16435 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.064242}, mono={3.640000}: OSMUX message (len=242): OSMUX seq=018 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=019 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9467 timestamp=1681742217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9468 timestamp=1681742377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9469 timestamp=1681742537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9470 timestamp=1681742697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9471 timestamp=1681742857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16433 -> 16435 (1 lost packets)
+sys={27.064242}, mono={3.640000}: OSMUX message (len=272): OSMUX seq=009 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9255 timestamp=1681708297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9256 timestamp=1681708457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9257 timestamp=1681708617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9255 timestamp=1681708297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9256 timestamp=1681708457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.064242}, mono={3.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9257 timestamp=1681708617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.084242}, mono={3.660000}: clock_override_add
-sys={27.084242}, mono={3.660000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9472 timestamp=1681743017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.084242}, mono={3.660000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9258 timestamp=1681708777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.084242}, mono={3.660000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9258 timestamp=1681708777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.104242}, mono={3.680000}: clock_override_add
sys={27.104242}, mono={3.680000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16436 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16434 -> 16436 (1 lost packets)
sys={27.104242}, mono={3.680000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16437 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16435 -> 16437 (1 lost packets)
sys={27.104242}, mono={3.680000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16438 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16436 -> 16438 (1 lost packets)
sys={27.104242}, mono={3.680000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16439 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.104242}, mono={3.680000}: OSMUX message (len=242): OSMUX seq=020 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=021 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9473 timestamp=1681743177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9474 timestamp=1681743337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9475 timestamp=1681743497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9476 timestamp=1681743657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9477 timestamp=1681743817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16437 -> 16439 (1 lost packets)
+sys={27.104242}, mono={3.680000}: OSMUX message (len=272): OSMUX seq=010 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=010 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9259 timestamp=1681708937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9260 timestamp=1681709097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9261 timestamp=1681709257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9259 timestamp=1681708937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9260 timestamp=1681709097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.104242}, mono={3.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9261 timestamp=1681709257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.124242}, mono={3.700000}: clock_override_add
-sys={27.124242}, mono={3.700000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9478 timestamp=1681743977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.124242}, mono={3.700000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9262 timestamp=1681709417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.124242}, mono={3.700000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9262 timestamp=1681709417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.144242}, mono={3.720000}: clock_override_add
sys={27.144242}, mono={3.720000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16440 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16438 -> 16440 (1 lost packets)
sys={27.144242}, mono={3.720000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16441 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16439 -> 16441 (1 lost packets)
sys={27.144242}, mono={3.720000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16442 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16440 -> 16442 (1 lost packets)
sys={27.144242}, mono={3.720000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16443 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.144242}, mono={3.720000}: OSMUX message (len=242): OSMUX seq=022 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=023 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9479 timestamp=1681744137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9480 timestamp=1681744297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9481 timestamp=1681744457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9482 timestamp=1681744617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9483 timestamp=1681744777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16441 -> 16443 (1 lost packets)
+sys={27.144242}, mono={3.720000}: OSMUX message (len=272): OSMUX seq=011 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9263 timestamp=1681709577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9264 timestamp=1681709737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9265 timestamp=1681709897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9263 timestamp=1681709577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9264 timestamp=1681709737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.144242}, mono={3.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9265 timestamp=1681709897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.164242}, mono={3.740000}: clock_override_add
-sys={27.164242}, mono={3.740000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9484 timestamp=1681744937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.164242}, mono={3.740000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9266 timestamp=1681710057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.164242}, mono={3.740000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9266 timestamp=1681710057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.184242}, mono={3.760000}: clock_override_add
sys={27.184242}, mono={3.760000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16444 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16442 -> 16444 (1 lost packets)
sys={27.184242}, mono={3.760000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16445 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16443 -> 16445 (1 lost packets)
sys={27.184242}, mono={3.760000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16446 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16444 -> 16446 (1 lost packets)
sys={27.184242}, mono={3.760000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16447 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.184242}, mono={3.760000}: OSMUX message (len=242): OSMUX seq=024 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=025 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9485 timestamp=1681745097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9486 timestamp=1681745257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9487 timestamp=1681745417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9488 timestamp=1681745577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9489 timestamp=1681745737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16445 -> 16447 (1 lost packets)
+sys={27.184242}, mono={3.760000}: OSMUX message (len=272): OSMUX seq=012 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=012 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9267 timestamp=1681710217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9268 timestamp=1681710377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9269 timestamp=1681710537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9267 timestamp=1681710217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9268 timestamp=1681710377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.184242}, mono={3.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9269 timestamp=1681710537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.204242}, mono={3.780000}: clock_override_add
-sys={27.204242}, mono={3.780000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9490 timestamp=1681745897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.204242}, mono={3.780000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9270 timestamp=1681710697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.204242}, mono={3.780000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9270 timestamp=1681710697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.224242}, mono={3.800000}: clock_override_add
sys={27.224242}, mono={3.800000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16448 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16446 -> 16448 (1 lost packets)
sys={27.224242}, mono={3.800000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16449 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16447 -> 16449 (1 lost packets)
sys={27.224242}, mono={3.800000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16450 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16448 -> 16450 (1 lost packets)
sys={27.224242}, mono={3.800000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16451 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.224242}, mono={3.800000}: OSMUX message (len=242): OSMUX seq=026 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=027 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9491 timestamp=1681746057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9492 timestamp=1681746217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9493 timestamp=1681746377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9494 timestamp=1681746537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9495 timestamp=1681746697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16449 -> 16451 (1 lost packets)
+sys={27.224242}, mono={3.800000}: OSMUX message (len=272): OSMUX seq=013 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9271 timestamp=1681710857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9272 timestamp=1681711017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9273 timestamp=1681711177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9271 timestamp=1681710857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9272 timestamp=1681711017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.224242}, mono={3.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9273 timestamp=1681711177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.244242}, mono={3.820000}: clock_override_add
-sys={27.244242}, mono={3.820000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9496 timestamp=1681746857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.244242}, mono={3.820000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9274 timestamp=1681711337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.244242}, mono={3.820000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9274 timestamp=1681711337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.264242}, mono={3.840000}: clock_override_add
sys={27.264242}, mono={3.840000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16452 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16450 -> 16452 (1 lost packets)
sys={27.264242}, mono={3.840000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16453 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16451 -> 16453 (1 lost packets)
sys={27.264242}, mono={3.840000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16454 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16452 -> 16454 (1 lost packets)
sys={27.264242}, mono={3.840000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16455 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.264242}, mono={3.840000}: OSMUX message (len=242): OSMUX seq=028 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=029 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9497 timestamp=1681747017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9498 timestamp=1681747177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9499 timestamp=1681747337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9500 timestamp=1681747497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9501 timestamp=1681747657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16453 -> 16455 (1 lost packets)
+sys={27.264242}, mono={3.840000}: OSMUX message (len=272): OSMUX seq=014 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=014 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9275 timestamp=1681711497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9276 timestamp=1681711657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9277 timestamp=1681711817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9275 timestamp=1681711497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9276 timestamp=1681711657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.264242}, mono={3.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9277 timestamp=1681711817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.284242}, mono={3.860000}: clock_override_add
-sys={27.284242}, mono={3.860000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9502 timestamp=1681747817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.284242}, mono={3.860000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9278 timestamp=1681711977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.284242}, mono={3.860000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9278 timestamp=1681711977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.304242}, mono={3.880000}: clock_override_add
sys={27.304242}, mono={3.880000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16456 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16454 -> 16456 (1 lost packets)
sys={27.304242}, mono={3.880000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16457 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16455 -> 16457 (1 lost packets)
sys={27.304242}, mono={3.880000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16458 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16456 -> 16458 (1 lost packets)
sys={27.304242}, mono={3.880000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16459 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.304242}, mono={3.880000}: OSMUX message (len=242): OSMUX seq=030 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=031 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
-sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9503 timestamp=1681747977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9504 timestamp=1681748137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9505 timestamp=1681748297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9506 timestamp=1681748457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9507 timestamp=1681748617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16457 -> 16459 (1 lost packets)
+sys={27.304242}, mono={3.880000}: OSMUX message (len=272): OSMUX seq=015 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=002 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00, OSMUX seq=000 ccid=003 ft=2 rtp_m=0 ctr=3 amr_f=0 amr_q=0 amr_ft=03 amr_cmr=00
+sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9279 timestamp=1681712137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9280 timestamp=1681712297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9281 timestamp=1681712457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9279 timestamp=1681712137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9280 timestamp=1681712297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.304242}, mono={3.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9281 timestamp=1681712457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.324242}, mono={3.900000}: clock_override_add
-sys={27.324242}, mono={3.900000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9508 timestamp=1681748777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.324242}, mono={3.900000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9282 timestamp=1681712617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.324242}, mono={3.900000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9282 timestamp=1681712617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.344242}, mono={3.920000}: clock_override_add
sys={27.344242}, mono={3.920000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=1 ext=0 csrc_count=0 sequence=16460 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.344242}, mono={3.920000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=1 ext=0 csrc_count=0 sequence=16461 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.344242}, mono={3.920000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16462 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,38/1472][CID=3,batched=1/4] RTP seq jump detected: 16460 -> 16462 (1 lost packets)
sys={27.344242}, mono={3.920000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16463 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.344242}, mono={3.920000}: OSMUX message (len=98): OSMUX seq=032 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=033 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9509 timestamp=1681748937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9510 timestamp=1681749097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9511 timestamp=1681749257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9512 timestamp=1681749417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9513 timestamp=1681749577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,68/1472][CID=2,batched=1/4] RTP seq jump detected: 16461 -> 16463 (1 lost packets)
+sys={27.344242}, mono={3.920000}: OSMUX message (len=98): OSMUX seq=000 ccid=002 ft=1 rtp_m=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=003 ft=1 rtp_m=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=1 ext=0 csrc_count=0 sequence=9222 timestamp=1681703017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=1 ext=0 csrc_count=0 sequence=9222 timestamp=1681703017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9283 timestamp=1681712777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.344242}, mono={3.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9283 timestamp=1681712777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.364242}, mono={3.940000}: clock_override_add
-sys={27.364242}, mono={3.940000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9514 timestamp=1681749737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.364242}, mono={3.940000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9284 timestamp=1681712937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.364242}, mono={3.940000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9284 timestamp=1681712937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.364242}, mono={3.940000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9223 timestamp=1681703177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.364242}, mono={3.940000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9223 timestamp=1681703177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.384242}, mono={3.960000}: clock_override_add
sys={27.384242}, mono={3.960000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16464 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16462 -> 16464 (1 lost packets)
sys={27.384242}, mono={3.960000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16465 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16463 -> 16465 (1 lost packets)
sys={27.384242}, mono={3.960000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16466 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16464 -> 16466 (1 lost packets)
sys={27.384242}, mono={3.960000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16467 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.384242}, mono={3.960000}: OSMUX message (len=98): OSMUX seq=034 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=035 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9515 timestamp=1681749897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9516 timestamp=1681750057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9517 timestamp=1681750217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9518 timestamp=1681750377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9519 timestamp=1681750537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16465 -> 16467 (1 lost packets)
+sys={27.384242}, mono={3.960000}: OSMUX message (len=128): OSMUX seq=001 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9224 timestamp=1681703337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9225 timestamp=1681703497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9224 timestamp=1681703337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.384242}, mono={3.960000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9225 timestamp=1681703497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.404242}, mono={3.980000}: clock_override_add
-sys={27.404242}, mono={3.980000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9520 timestamp=1681750697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.404242}, mono={3.980000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9226 timestamp=1681703657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.404242}, mono={3.980000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9226 timestamp=1681703657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.424242}, mono={4.000000}: clock_override_add
sys={27.424242}, mono={4.000000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16468 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16466 -> 16468 (1 lost packets)
sys={27.424242}, mono={4.000000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16469 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16467 -> 16469 (1 lost packets)
sys={27.424242}, mono={4.000000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16470 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16468 -> 16470 (1 lost packets)
sys={27.424242}, mono={4.000000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16471 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.424242}, mono={4.000000}: OSMUX message (len=98): OSMUX seq=036 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=037 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9521 timestamp=1681750857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9522 timestamp=1681751017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9523 timestamp=1681751177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9524 timestamp=1681751337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9525 timestamp=1681751497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16469 -> 16471 (1 lost packets)
+sys={27.424242}, mono={4.000000}: OSMUX message (len=128): OSMUX seq=002 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=002 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9227 timestamp=1681703817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9228 timestamp=1681703977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9229 timestamp=1681704137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9227 timestamp=1681703817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9228 timestamp=1681703977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.424242}, mono={4.000000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9229 timestamp=1681704137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.444242}, mono={4.020000}: clock_override_add
-sys={27.444242}, mono={4.020000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9526 timestamp=1681751657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.444242}, mono={4.020000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9230 timestamp=1681704297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.444242}, mono={4.020000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9230 timestamp=1681704297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.464242}, mono={4.040000}: clock_override_add
sys={27.464242}, mono={4.040000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16472 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16470 -> 16472 (1 lost packets)
sys={27.464242}, mono={4.040000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16473 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16471 -> 16473 (1 lost packets)
sys={27.464242}, mono={4.040000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16474 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16472 -> 16474 (1 lost packets)
sys={27.464242}, mono={4.040000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16475 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.464242}, mono={4.040000}: OSMUX message (len=98): OSMUX seq=038 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=039 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9527 timestamp=1681751817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9528 timestamp=1681751977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9529 timestamp=1681752137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9530 timestamp=1681752297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9531 timestamp=1681752457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16473 -> 16475 (1 lost packets)
+sys={27.464242}, mono={4.040000}: OSMUX message (len=128): OSMUX seq=003 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9231 timestamp=1681704457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9232 timestamp=1681704617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9233 timestamp=1681704777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9231 timestamp=1681704457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9232 timestamp=1681704617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.464242}, mono={4.040000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9233 timestamp=1681704777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.484242}, mono={4.060000}: clock_override_add
-sys={27.484242}, mono={4.060000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9532 timestamp=1681752617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.484242}, mono={4.060000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9234 timestamp=1681704937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.484242}, mono={4.060000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9234 timestamp=1681704937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.504242}, mono={4.080000}: clock_override_add
sys={27.504242}, mono={4.080000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16476 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16474 -> 16476 (1 lost packets)
sys={27.504242}, mono={4.080000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16477 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16475 -> 16477 (1 lost packets)
sys={27.504242}, mono={4.080000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16478 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16476 -> 16478 (1 lost packets)
sys={27.504242}, mono={4.080000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16479 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.504242}, mono={4.080000}: OSMUX message (len=98): OSMUX seq=040 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=041 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9533 timestamp=1681752777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9534 timestamp=1681752937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9535 timestamp=1681753097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9536 timestamp=1681753257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9537 timestamp=1681753417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16477 -> 16479 (1 lost packets)
+sys={27.504242}, mono={4.080000}: OSMUX message (len=128): OSMUX seq=004 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=004 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9235 timestamp=1681705097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9236 timestamp=1681705257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9237 timestamp=1681705417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9235 timestamp=1681705097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9236 timestamp=1681705257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.504242}, mono={4.080000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9237 timestamp=1681705417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.524242}, mono={4.100000}: clock_override_add
-sys={27.524242}, mono={4.100000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9538 timestamp=1681753577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.524242}, mono={4.100000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9238 timestamp=1681705577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.524242}, mono={4.100000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9238 timestamp=1681705577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.544242}, mono={4.120000}: clock_override_add
sys={27.544242}, mono={4.120000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16480 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16478 -> 16480 (1 lost packets)
sys={27.544242}, mono={4.120000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16481 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16479 -> 16481 (1 lost packets)
sys={27.544242}, mono={4.120000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16482 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16480 -> 16482 (1 lost packets)
sys={27.544242}, mono={4.120000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16483 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.544242}, mono={4.120000}: OSMUX message (len=98): OSMUX seq=042 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=043 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9539 timestamp=1681753737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9540 timestamp=1681753897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9541 timestamp=1681754057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9542 timestamp=1681754217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9543 timestamp=1681754377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16481 -> 16483 (1 lost packets)
+sys={27.544242}, mono={4.120000}: OSMUX message (len=128): OSMUX seq=005 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9239 timestamp=1681705737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9240 timestamp=1681705897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9241 timestamp=1681706057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9239 timestamp=1681705737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9240 timestamp=1681705897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.544242}, mono={4.120000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9241 timestamp=1681706057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.564242}, mono={4.140000}: clock_override_add
-sys={27.564242}, mono={4.140000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9544 timestamp=1681754537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.564242}, mono={4.140000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9242 timestamp=1681706217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.564242}, mono={4.140000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9242 timestamp=1681706217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.584242}, mono={4.160000}: clock_override_add
sys={27.584242}, mono={4.160000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16484 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16482 -> 16484 (1 lost packets)
sys={27.584242}, mono={4.160000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16485 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16483 -> 16485 (1 lost packets)
sys={27.584242}, mono={4.160000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16486 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16484 -> 16486 (1 lost packets)
sys={27.584242}, mono={4.160000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16487 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.584242}, mono={4.160000}: OSMUX message (len=98): OSMUX seq=044 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=045 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9545 timestamp=1681754697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9546 timestamp=1681754857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9547 timestamp=1681755017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9548 timestamp=1681755177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9549 timestamp=1681755337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16485 -> 16487 (1 lost packets)
+sys={27.584242}, mono={4.160000}: OSMUX message (len=128): OSMUX seq=006 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=006 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9243 timestamp=1681706377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9244 timestamp=1681706537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9245 timestamp=1681706697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9243 timestamp=1681706377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9244 timestamp=1681706537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.584242}, mono={4.160000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9245 timestamp=1681706697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.604242}, mono={4.180000}: clock_override_add
-sys={27.604242}, mono={4.180000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9550 timestamp=1681755497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.604242}, mono={4.180000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9246 timestamp=1681706857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.604242}, mono={4.180000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9246 timestamp=1681706857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.624242}, mono={4.200000}: clock_override_add
sys={27.624242}, mono={4.200000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16488 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16486 -> 16488 (1 lost packets)
sys={27.624242}, mono={4.200000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16489 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16487 -> 16489 (1 lost packets)
sys={27.624242}, mono={4.200000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16490 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16488 -> 16490 (1 lost packets)
sys={27.624242}, mono={4.200000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16491 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.624242}, mono={4.200000}: OSMUX message (len=98): OSMUX seq=046 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=047 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9551 timestamp=1681755657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9552 timestamp=1681755817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9553 timestamp=1681755977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9554 timestamp=1681756137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9555 timestamp=1681756297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16489 -> 16491 (1 lost packets)
+sys={27.624242}, mono={4.200000}: OSMUX message (len=128): OSMUX seq=007 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9247 timestamp=1681707017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9248 timestamp=1681707177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9249 timestamp=1681707337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9247 timestamp=1681707017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9248 timestamp=1681707177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.624242}, mono={4.200000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9249 timestamp=1681707337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.644242}, mono={4.220000}: clock_override_add
-sys={27.644242}, mono={4.220000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9556 timestamp=1681756457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.644242}, mono={4.220000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9250 timestamp=1681707497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.644242}, mono={4.220000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9250 timestamp=1681707497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.664242}, mono={4.240000}: clock_override_add
sys={27.664242}, mono={4.240000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16492 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16490 -> 16492 (1 lost packets)
sys={27.664242}, mono={4.240000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16493 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16491 -> 16493 (1 lost packets)
sys={27.664242}, mono={4.240000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16494 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16492 -> 16494 (1 lost packets)
sys={27.664242}, mono={4.240000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16495 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.664242}, mono={4.240000}: OSMUX message (len=98): OSMUX seq=048 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=049 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9557 timestamp=1681756617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9558 timestamp=1681756777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9559 timestamp=1681756937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9560 timestamp=1681757097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9561 timestamp=1681757257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16493 -> 16495 (1 lost packets)
+sys={27.664242}, mono={4.240000}: OSMUX message (len=128): OSMUX seq=008 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=008 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9251 timestamp=1681707657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9252 timestamp=1681707817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9253 timestamp=1681707977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9251 timestamp=1681707657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9252 timestamp=1681707817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.664242}, mono={4.240000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9253 timestamp=1681707977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.684242}, mono={4.260000}: clock_override_add
-sys={27.684242}, mono={4.260000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9562 timestamp=1681757417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.684242}, mono={4.260000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9254 timestamp=1681708137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.684242}, mono={4.260000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9254 timestamp=1681708137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.704242}, mono={4.280000}: clock_override_add
sys={27.704242}, mono={4.280000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16496 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16494 -> 16496 (1 lost packets)
sys={27.704242}, mono={4.280000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16497 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16495 -> 16497 (1 lost packets)
sys={27.704242}, mono={4.280000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16498 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16496 -> 16498 (1 lost packets)
sys={27.704242}, mono={4.280000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16499 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.704242}, mono={4.280000}: OSMUX message (len=98): OSMUX seq=050 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=051 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9563 timestamp=1681757577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9564 timestamp=1681757737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9565 timestamp=1681757897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9566 timestamp=1681758057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9567 timestamp=1681758217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16497 -> 16499 (1 lost packets)
+sys={27.704242}, mono={4.280000}: OSMUX message (len=128): OSMUX seq=009 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9255 timestamp=1681708297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9256 timestamp=1681708457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9257 timestamp=1681708617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9255 timestamp=1681708297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9256 timestamp=1681708457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.704242}, mono={4.280000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9257 timestamp=1681708617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.724242}, mono={4.300000}: clock_override_add
-sys={27.724242}, mono={4.300000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9568 timestamp=1681758377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.724242}, mono={4.300000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9258 timestamp=1681708777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.724242}, mono={4.300000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9258 timestamp=1681708777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.744242}, mono={4.320000}: clock_override_add
sys={27.744242}, mono={4.320000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16500 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16498 -> 16500 (1 lost packets)
sys={27.744242}, mono={4.320000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16501 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16499 -> 16501 (1 lost packets)
sys={27.744242}, mono={4.320000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16502 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16500 -> 16502 (1 lost packets)
sys={27.744242}, mono={4.320000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16503 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.744242}, mono={4.320000}: OSMUX message (len=98): OSMUX seq=052 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=053 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9569 timestamp=1681758537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9570 timestamp=1681758697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9571 timestamp=1681758857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9572 timestamp=1681759017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9573 timestamp=1681759177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16501 -> 16503 (1 lost packets)
+sys={27.744242}, mono={4.320000}: OSMUX message (len=128): OSMUX seq=010 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=010 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9259 timestamp=1681708937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9260 timestamp=1681709097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9261 timestamp=1681709257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9259 timestamp=1681708937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9260 timestamp=1681709097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.744242}, mono={4.320000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9261 timestamp=1681709257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.764242}, mono={4.340000}: clock_override_add
-sys={27.764242}, mono={4.340000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9574 timestamp=1681759337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.764242}, mono={4.340000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9262 timestamp=1681709417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.764242}, mono={4.340000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9262 timestamp=1681709417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.784242}, mono={4.360000}: clock_override_add
sys={27.784242}, mono={4.360000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16504 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16502 -> 16504 (1 lost packets)
sys={27.784242}, mono={4.360000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16505 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16503 -> 16505 (1 lost packets)
sys={27.784242}, mono={4.360000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16506 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16504 -> 16506 (1 lost packets)
sys={27.784242}, mono={4.360000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16507 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.784242}, mono={4.360000}: OSMUX message (len=98): OSMUX seq=054 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=055 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9575 timestamp=1681759497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9576 timestamp=1681759657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9577 timestamp=1681759817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9578 timestamp=1681759977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9579 timestamp=1681760137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16505 -> 16507 (1 lost packets)
+sys={27.784242}, mono={4.360000}: OSMUX message (len=128): OSMUX seq=011 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9263 timestamp=1681709577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9264 timestamp=1681709737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9265 timestamp=1681709897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9263 timestamp=1681709577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9264 timestamp=1681709737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.784242}, mono={4.360000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9265 timestamp=1681709897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.804242}, mono={4.380000}: clock_override_add
-sys={27.804242}, mono={4.380000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9580 timestamp=1681760297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.804242}, mono={4.380000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9266 timestamp=1681710057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.804242}, mono={4.380000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9266 timestamp=1681710057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.824242}, mono={4.400000}: clock_override_add
sys={27.824242}, mono={4.400000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16508 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16506 -> 16508 (1 lost packets)
sys={27.824242}, mono={4.400000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16509 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16507 -> 16509 (1 lost packets)
sys={27.824242}, mono={4.400000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16510 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16508 -> 16510 (1 lost packets)
sys={27.824242}, mono={4.400000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16511 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.824242}, mono={4.400000}: OSMUX message (len=98): OSMUX seq=056 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=057 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9581 timestamp=1681760457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9582 timestamp=1681760617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9583 timestamp=1681760777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9584 timestamp=1681760937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9585 timestamp=1681761097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16509 -> 16511 (1 lost packets)
+sys={27.824242}, mono={4.400000}: OSMUX message (len=128): OSMUX seq=012 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=012 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9267 timestamp=1681710217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9268 timestamp=1681710377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9269 timestamp=1681710537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9267 timestamp=1681710217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9268 timestamp=1681710377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.824242}, mono={4.400000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9269 timestamp=1681710537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.844242}, mono={4.420000}: clock_override_add
-sys={27.844242}, mono={4.420000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9586 timestamp=1681761257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.844242}, mono={4.420000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9270 timestamp=1681710697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.844242}, mono={4.420000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9270 timestamp=1681710697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.864242}, mono={4.440000}: clock_override_add
sys={27.864242}, mono={4.440000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16512 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16510 -> 16512 (1 lost packets)
sys={27.864242}, mono={4.440000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16513 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16511 -> 16513 (1 lost packets)
sys={27.864242}, mono={4.440000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16514 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16512 -> 16514 (1 lost packets)
sys={27.864242}, mono={4.440000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16515 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.864242}, mono={4.440000}: OSMUX message (len=98): OSMUX seq=058 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=059 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9587 timestamp=1681761417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9588 timestamp=1681761577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9589 timestamp=1681761737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9590 timestamp=1681761897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9591 timestamp=1681762057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16513 -> 16515 (1 lost packets)
+sys={27.864242}, mono={4.440000}: OSMUX message (len=128): OSMUX seq=013 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9271 timestamp=1681710857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9272 timestamp=1681711017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9273 timestamp=1681711177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9271 timestamp=1681710857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9272 timestamp=1681711017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.864242}, mono={4.440000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9273 timestamp=1681711177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.884242}, mono={4.460000}: clock_override_add
-sys={27.884242}, mono={4.460000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9592 timestamp=1681762217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.884242}, mono={4.460000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9274 timestamp=1681711337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.884242}, mono={4.460000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9274 timestamp=1681711337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.904242}, mono={4.480000}: clock_override_add
sys={27.904242}, mono={4.480000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16516 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16514 -> 16516 (1 lost packets)
sys={27.904242}, mono={4.480000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16517 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16515 -> 16517 (1 lost packets)
sys={27.904242}, mono={4.480000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16518 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16516 -> 16518 (1 lost packets)
sys={27.904242}, mono={4.480000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16519 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.904242}, mono={4.480000}: OSMUX message (len=98): OSMUX seq=060 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=061 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9593 timestamp=1681762377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9594 timestamp=1681762537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9595 timestamp=1681762697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9596 timestamp=1681762857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9597 timestamp=1681763017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16517 -> 16519 (1 lost packets)
+sys={27.904242}, mono={4.480000}: OSMUX message (len=128): OSMUX seq=014 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=014 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9275 timestamp=1681711497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9276 timestamp=1681711657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9277 timestamp=1681711817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9275 timestamp=1681711497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9276 timestamp=1681711657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.904242}, mono={4.480000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9277 timestamp=1681711817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.924242}, mono={4.500000}: clock_override_add
-sys={27.924242}, mono={4.500000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9598 timestamp=1681763177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.924242}, mono={4.500000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9278 timestamp=1681711977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.924242}, mono={4.500000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9278 timestamp=1681711977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.944242}, mono={4.520000}: clock_override_add
sys={27.944242}, mono={4.520000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16520 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=3,batched=0/4] RTP seq jump detected: 16518 -> 16520 (1 lost packets)
sys={27.944242}, mono={4.520000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16521 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=2,batched=0/4] RTP seq jump detected: 16519 -> 16521 (1 lost packets)
sys={27.944242}, mono={4.520000}: adding to ccid=3 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16522 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=3,batched=2/4] RTP seq jump detected: 16520 -> 16522 (1 lost packets)
sys={27.944242}, mono={4.520000}: adding to ccid=2 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16523 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.944242}, mono={4.520000}: OSMUX message (len=98): OSMUX seq=062 ccid=002 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=063 ccid=003 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9599 timestamp=1681763337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9600 timestamp=1681763497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9601 timestamp=1681763657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9602 timestamp=1681763817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9603 timestamp=1681763977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=2,batched=2/4] RTP seq jump detected: 16521 -> 16523 (1 lost packets)
+sys={27.944242}, mono={4.520000}: OSMUX message (len=128): OSMUX seq=015 ccid=002 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=003 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9279 timestamp=1681712137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9280 timestamp=1681712297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9281 timestamp=1681712457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9279 timestamp=1681712137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9280 timestamp=1681712297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.944242}, mono={4.520000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9281 timestamp=1681712457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.964242}, mono={4.540000}: clock_override_add
-sys={27.964242}, mono={4.540000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9604 timestamp=1681764137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.964242}, mono={4.540000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9282 timestamp=1681712617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.964242}, mono={4.540000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9282 timestamp=1681712617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.984242}, mono={4.560000}: clock_override_add
+DLMUX [second,0/1472][CID=0,batched=0/4] Closing circuit
+DLMUX [second,0/1472][CID=1,batched=0/4] Closing circuit
+DLMUX [second,0/1472][CID=2,batched=0/4] Closing circuit
+DLMUX [second,0/1472][CID=3,batched=0/4] Closing circuit
+DLMUX [second,0/1472][CID=0,batched=0/4] Circuit opened successfully
+DLMUX [second,0/1472][CID=1,batched=0/4] Circuit opened successfully
sys={27.984242}, mono={4.560000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=1 ext=0 csrc_count=0 sequence=16524 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.984242}, mono={4.560000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=1 ext=0 csrc_count=0 sequence=16525 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={27.984242}, mono={4.560000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16526 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,38/1472][CID=1,batched=1/4] RTP seq jump detected: 16524 -> 16526 (1 lost packets)
sys={27.984242}, mono={4.560000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16527 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={27.984242}, mono={4.560000}: OSMUX message (len=98): OSMUX seq=064 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=065 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9605 timestamp=1681764297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9606 timestamp=1681764457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9607 timestamp=1681764617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9608 timestamp=1681764777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9609 timestamp=1681764937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,68/1472][CID=0,batched=1/4] RTP seq jump detected: 16525 -> 16527 (1 lost packets)
+sys={27.984242}, mono={4.560000}: OSMUX message (len=98): OSMUX seq=000 ccid=000 ft=1 rtp_m=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=000 ccid=001 ft=1 rtp_m=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=1 ext=0 csrc_count=0 sequence=9285 timestamp=1681713097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=1 ext=0 csrc_count=0 sequence=9285 timestamp=1681713097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9283 timestamp=1681712777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={27.984242}, mono={4.560000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9283 timestamp=1681712777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.004242}, mono={4.580000}: clock_override_add
-sys={28.004242}, mono={4.580000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9610 timestamp=1681765097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.004242}, mono={4.580000}: extracted packet: RTP ver=2 ssrc=117440514 type=98 marker=0 ext=0 csrc_count=0 sequence=9284 timestamp=1681712937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.004242}, mono={4.580000}: extracted packet: RTP ver=2 ssrc=117440515 type=98 marker=0 ext=0 csrc_count=0 sequence=9284 timestamp=1681712937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.004242}, mono={4.580000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9286 timestamp=1681713257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.004242}, mono={4.580000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9286 timestamp=1681713257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.024242}, mono={4.600000}: clock_override_add
sys={28.024242}, mono={4.600000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16528 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16526 -> 16528 (1 lost packets)
sys={28.024242}, mono={4.600000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16529 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16527 -> 16529 (1 lost packets)
sys={28.024242}, mono={4.600000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16530 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16528 -> 16530 (1 lost packets)
sys={28.024242}, mono={4.600000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16531 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.024242}, mono={4.600000}: OSMUX message (len=98): OSMUX seq=066 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=067 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9611 timestamp=1681765257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9612 timestamp=1681765417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9613 timestamp=1681765577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9614 timestamp=1681765737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9615 timestamp=1681765897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16529 -> 16531 (1 lost packets)
+sys={28.024242}, mono={4.600000}: OSMUX message (len=128): OSMUX seq=001 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=001 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9287 timestamp=1681713417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9288 timestamp=1681713577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9287 timestamp=1681713417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.024242}, mono={4.600000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9288 timestamp=1681713577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.044242}, mono={4.620000}: clock_override_add
-sys={28.044242}, mono={4.620000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9616 timestamp=1681766057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.044242}, mono={4.620000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9289 timestamp=1681713737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.044242}, mono={4.620000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9289 timestamp=1681713737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.064242}, mono={4.640000}: clock_override_add
sys={28.064242}, mono={4.640000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16532 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16530 -> 16532 (1 lost packets)
sys={28.064242}, mono={4.640000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16533 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16531 -> 16533 (1 lost packets)
sys={28.064242}, mono={4.640000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16534 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16532 -> 16534 (1 lost packets)
sys={28.064242}, mono={4.640000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16535 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.064242}, mono={4.640000}: OSMUX message (len=98): OSMUX seq=068 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=069 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9617 timestamp=1681766217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9618 timestamp=1681766377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9619 timestamp=1681766537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9620 timestamp=1681766697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9621 timestamp=1681766857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16533 -> 16535 (1 lost packets)
+sys={28.064242}, mono={4.640000}: OSMUX message (len=128): OSMUX seq=002 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=002 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9290 timestamp=1681713897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9291 timestamp=1681714057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9292 timestamp=1681714217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9290 timestamp=1681713897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9291 timestamp=1681714057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.064242}, mono={4.640000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9292 timestamp=1681714217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.084242}, mono={4.660000}: clock_override_add
-sys={28.084242}, mono={4.660000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9622 timestamp=1681767017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.084242}, mono={4.660000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9293 timestamp=1681714377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.084242}, mono={4.660000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9293 timestamp=1681714377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.104242}, mono={4.680000}: clock_override_add
sys={28.104242}, mono={4.680000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16536 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16534 -> 16536 (1 lost packets)
sys={28.104242}, mono={4.680000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16537 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16535 -> 16537 (1 lost packets)
sys={28.104242}, mono={4.680000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16538 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16536 -> 16538 (1 lost packets)
sys={28.104242}, mono={4.680000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16539 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.104242}, mono={4.680000}: OSMUX message (len=98): OSMUX seq=070 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=071 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9623 timestamp=1681767177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9624 timestamp=1681767337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9625 timestamp=1681767497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9626 timestamp=1681767657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9627 timestamp=1681767817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16537 -> 16539 (1 lost packets)
+sys={28.104242}, mono={4.680000}: OSMUX message (len=128): OSMUX seq=003 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=003 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9294 timestamp=1681714537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9295 timestamp=1681714697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9296 timestamp=1681714857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9294 timestamp=1681714537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9295 timestamp=1681714697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.104242}, mono={4.680000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9296 timestamp=1681714857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.124242}, mono={4.700000}: clock_override_add
-sys={28.124242}, mono={4.700000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9628 timestamp=1681767977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.124242}, mono={4.700000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9297 timestamp=1681715017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.124242}, mono={4.700000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9297 timestamp=1681715017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.144242}, mono={4.720000}: clock_override_add
sys={28.144242}, mono={4.720000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16540 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16538 -> 16540 (1 lost packets)
sys={28.144242}, mono={4.720000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16541 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16539 -> 16541 (1 lost packets)
sys={28.144242}, mono={4.720000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16542 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16540 -> 16542 (1 lost packets)
sys={28.144242}, mono={4.720000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16543 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.144242}, mono={4.720000}: OSMUX message (len=98): OSMUX seq=072 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=073 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9629 timestamp=1681768137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9630 timestamp=1681768297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9631 timestamp=1681768457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9632 timestamp=1681768617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9633 timestamp=1681768777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16541 -> 16543 (1 lost packets)
+sys={28.144242}, mono={4.720000}: OSMUX message (len=128): OSMUX seq=004 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=004 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9298 timestamp=1681715177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9299 timestamp=1681715337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9300 timestamp=1681715497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9298 timestamp=1681715177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9299 timestamp=1681715337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.144242}, mono={4.720000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9300 timestamp=1681715497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.164242}, mono={4.740000}: clock_override_add
-sys={28.164242}, mono={4.740000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9634 timestamp=1681768937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.164242}, mono={4.740000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9301 timestamp=1681715657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.164242}, mono={4.740000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9301 timestamp=1681715657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.184242}, mono={4.760000}: clock_override_add
sys={28.184242}, mono={4.760000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16544 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16542 -> 16544 (1 lost packets)
sys={28.184242}, mono={4.760000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16545 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16543 -> 16545 (1 lost packets)
sys={28.184242}, mono={4.760000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16546 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16544 -> 16546 (1 lost packets)
sys={28.184242}, mono={4.760000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16547 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.184242}, mono={4.760000}: OSMUX message (len=98): OSMUX seq=074 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=075 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9635 timestamp=1681769097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9636 timestamp=1681769257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9637 timestamp=1681769417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9638 timestamp=1681769577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9639 timestamp=1681769737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16545 -> 16547 (1 lost packets)
+sys={28.184242}, mono={4.760000}: OSMUX message (len=128): OSMUX seq=005 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=005 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9302 timestamp=1681715817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9303 timestamp=1681715977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9304 timestamp=1681716137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9302 timestamp=1681715817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9303 timestamp=1681715977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.184242}, mono={4.760000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9304 timestamp=1681716137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.204242}, mono={4.780000}: clock_override_add
-sys={28.204242}, mono={4.780000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9640 timestamp=1681769897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.204242}, mono={4.780000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9305 timestamp=1681716297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.204242}, mono={4.780000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9305 timestamp=1681716297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.224242}, mono={4.800000}: clock_override_add
sys={28.224242}, mono={4.800000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16548 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16546 -> 16548 (1 lost packets)
sys={28.224242}, mono={4.800000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16549 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16547 -> 16549 (1 lost packets)
sys={28.224242}, mono={4.800000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16550 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16548 -> 16550 (1 lost packets)
sys={28.224242}, mono={4.800000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16551 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.224242}, mono={4.800000}: OSMUX message (len=98): OSMUX seq=076 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=077 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9641 timestamp=1681770057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9642 timestamp=1681770217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9643 timestamp=1681770377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9644 timestamp=1681770537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9645 timestamp=1681770697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16549 -> 16551 (1 lost packets)
+sys={28.224242}, mono={4.800000}: OSMUX message (len=128): OSMUX seq=006 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=006 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9306 timestamp=1681716457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9307 timestamp=1681716617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9308 timestamp=1681716777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9306 timestamp=1681716457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9307 timestamp=1681716617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.224242}, mono={4.800000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9308 timestamp=1681716777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.244242}, mono={4.820000}: clock_override_add
-sys={28.244242}, mono={4.820000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9646 timestamp=1681770857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.244242}, mono={4.820000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9309 timestamp=1681716937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.244242}, mono={4.820000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9309 timestamp=1681716937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.264242}, mono={4.840000}: clock_override_add
sys={28.264242}, mono={4.840000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16552 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16550 -> 16552 (1 lost packets)
sys={28.264242}, mono={4.840000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16553 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16551 -> 16553 (1 lost packets)
sys={28.264242}, mono={4.840000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16554 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16552 -> 16554 (1 lost packets)
sys={28.264242}, mono={4.840000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16555 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.264242}, mono={4.840000}: OSMUX message (len=98): OSMUX seq=078 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=079 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9647 timestamp=1681771017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9648 timestamp=1681771177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9649 timestamp=1681771337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9650 timestamp=1681771497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9651 timestamp=1681771657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16553 -> 16555 (1 lost packets)
+sys={28.264242}, mono={4.840000}: OSMUX message (len=128): OSMUX seq=007 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=007 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9310 timestamp=1681717097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9311 timestamp=1681717257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9312 timestamp=1681717417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9310 timestamp=1681717097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9311 timestamp=1681717257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.264242}, mono={4.840000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9312 timestamp=1681717417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.284242}, mono={4.860000}: clock_override_add
-sys={28.284242}, mono={4.860000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9652 timestamp=1681771817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.284242}, mono={4.860000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9313 timestamp=1681717577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.284242}, mono={4.860000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9313 timestamp=1681717577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.304242}, mono={4.880000}: clock_override_add
sys={28.304242}, mono={4.880000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16556 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16554 -> 16556 (1 lost packets)
sys={28.304242}, mono={4.880000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16557 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16555 -> 16557 (1 lost packets)
sys={28.304242}, mono={4.880000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16558 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16556 -> 16558 (1 lost packets)
sys={28.304242}, mono={4.880000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16559 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.304242}, mono={4.880000}: OSMUX message (len=98): OSMUX seq=080 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=081 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9653 timestamp=1681771977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9654 timestamp=1681772137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9655 timestamp=1681772297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9656 timestamp=1681772457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9657 timestamp=1681772617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16557 -> 16559 (1 lost packets)
+sys={28.304242}, mono={4.880000}: OSMUX message (len=128): OSMUX seq=008 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=008 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9314 timestamp=1681717737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9315 timestamp=1681717897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9316 timestamp=1681718057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9314 timestamp=1681717737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9315 timestamp=1681717897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.304242}, mono={4.880000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9316 timestamp=1681718057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.324242}, mono={4.900000}: clock_override_add
-sys={28.324242}, mono={4.900000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9658 timestamp=1681772777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.324242}, mono={4.900000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9317 timestamp=1681718217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.324242}, mono={4.900000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9317 timestamp=1681718217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.344242}, mono={4.920000}: clock_override_add
sys={28.344242}, mono={4.920000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16560 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16558 -> 16560 (1 lost packets)
sys={28.344242}, mono={4.920000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16561 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16559 -> 16561 (1 lost packets)
sys={28.344242}, mono={4.920000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16562 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16560 -> 16562 (1 lost packets)
sys={28.344242}, mono={4.920000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16563 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.344242}, mono={4.920000}: OSMUX message (len=98): OSMUX seq=082 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=083 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9659 timestamp=1681772937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9660 timestamp=1681773097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9661 timestamp=1681773257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9662 timestamp=1681773417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9663 timestamp=1681773577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16561 -> 16563 (1 lost packets)
+sys={28.344242}, mono={4.920000}: OSMUX message (len=128): OSMUX seq=009 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=009 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9318 timestamp=1681718377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9319 timestamp=1681718537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9320 timestamp=1681718697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9318 timestamp=1681718377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9319 timestamp=1681718537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.344242}, mono={4.920000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9320 timestamp=1681718697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.364242}, mono={4.940000}: clock_override_add
-sys={28.364242}, mono={4.940000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9664 timestamp=1681773737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.364242}, mono={4.940000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9321 timestamp=1681718857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.364242}, mono={4.940000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9321 timestamp=1681718857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.384242}, mono={4.960000}: clock_override_add
sys={28.384242}, mono={4.960000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16564 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16562 -> 16564 (1 lost packets)
sys={28.384242}, mono={4.960000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16565 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16563 -> 16565 (1 lost packets)
sys={28.384242}, mono={4.960000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16566 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16564 -> 16566 (1 lost packets)
sys={28.384242}, mono={4.960000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16567 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.384242}, mono={4.960000}: OSMUX message (len=98): OSMUX seq=084 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=085 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9665 timestamp=1681773897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9666 timestamp=1681774057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9667 timestamp=1681774217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9668 timestamp=1681774377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9669 timestamp=1681774537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16565 -> 16567 (1 lost packets)
+sys={28.384242}, mono={4.960000}: OSMUX message (len=128): OSMUX seq=010 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=010 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9322 timestamp=1681719017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9323 timestamp=1681719177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9324 timestamp=1681719337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9322 timestamp=1681719017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9323 timestamp=1681719177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.384242}, mono={4.960000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9324 timestamp=1681719337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.404242}, mono={4.980000}: clock_override_add
-sys={28.404242}, mono={4.980000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9670 timestamp=1681774697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.404242}, mono={4.980000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9325 timestamp=1681719497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.404242}, mono={4.980000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9325 timestamp=1681719497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.424242}, mono={5.000000}: clock_override_add
sys={28.424242}, mono={5.000000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16568 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16566 -> 16568 (1 lost packets)
sys={28.424242}, mono={5.000000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16569 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16567 -> 16569 (1 lost packets)
sys={28.424242}, mono={5.000000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16570 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16568 -> 16570 (1 lost packets)
sys={28.424242}, mono={5.000000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16571 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.424242}, mono={5.000000}: OSMUX message (len=98): OSMUX seq=086 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=087 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9671 timestamp=1681774857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9672 timestamp=1681775017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9673 timestamp=1681775177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9674 timestamp=1681775337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9675 timestamp=1681775497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16569 -> 16571 (1 lost packets)
+sys={28.424242}, mono={5.000000}: OSMUX message (len=128): OSMUX seq=011 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=011 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9326 timestamp=1681719657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9327 timestamp=1681719817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9328 timestamp=1681719977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9326 timestamp=1681719657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9327 timestamp=1681719817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.424242}, mono={5.000000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9328 timestamp=1681719977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.444242}, mono={5.020000}: clock_override_add
-sys={28.444242}, mono={5.020000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9676 timestamp=1681775657 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.444242}, mono={5.020000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9329 timestamp=1681720137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.444242}, mono={5.020000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9329 timestamp=1681720137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.464242}, mono={5.040000}: clock_override_add
sys={28.464242}, mono={5.040000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16572 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16570 -> 16572 (1 lost packets)
sys={28.464242}, mono={5.040000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16573 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16571 -> 16573 (1 lost packets)
sys={28.464242}, mono={5.040000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16574 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16572 -> 16574 (1 lost packets)
sys={28.464242}, mono={5.040000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16575 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.464242}, mono={5.040000}: OSMUX message (len=98): OSMUX seq=088 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=089 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9677 timestamp=1681775817 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9678 timestamp=1681775977 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9679 timestamp=1681776137 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9680 timestamp=1681776297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9681 timestamp=1681776457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16573 -> 16575 (1 lost packets)
+sys={28.464242}, mono={5.040000}: OSMUX message (len=128): OSMUX seq=012 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=012 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9330 timestamp=1681720297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9331 timestamp=1681720457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9332 timestamp=1681720617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9330 timestamp=1681720297 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9331 timestamp=1681720457 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.464242}, mono={5.040000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9332 timestamp=1681720617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.484242}, mono={5.060000}: clock_override_add
-sys={28.484242}, mono={5.060000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9682 timestamp=1681776617 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.484242}, mono={5.060000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9333 timestamp=1681720777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.484242}, mono={5.060000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9333 timestamp=1681720777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.504242}, mono={5.080000}: clock_override_add
sys={28.504242}, mono={5.080000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16576 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16574 -> 16576 (1 lost packets)
sys={28.504242}, mono={5.080000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16577 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16575 -> 16577 (1 lost packets)
sys={28.504242}, mono={5.080000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16578 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16576 -> 16578 (1 lost packets)
sys={28.504242}, mono={5.080000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16579 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.504242}, mono={5.080000}: OSMUX message (len=98): OSMUX seq=090 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=091 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9683 timestamp=1681776777 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9684 timestamp=1681776937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9685 timestamp=1681777097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9686 timestamp=1681777257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9687 timestamp=1681777417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16577 -> 16579 (1 lost packets)
+sys={28.504242}, mono={5.080000}: OSMUX message (len=128): OSMUX seq=013 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=013 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9334 timestamp=1681720937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9335 timestamp=1681721097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9336 timestamp=1681721257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9334 timestamp=1681720937 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9335 timestamp=1681721097 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.504242}, mono={5.080000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9336 timestamp=1681721257 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.524242}, mono={5.100000}: clock_override_add
-sys={28.524242}, mono={5.100000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9688 timestamp=1681777577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.524242}, mono={5.100000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9337 timestamp=1681721417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.524242}, mono={5.100000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9337 timestamp=1681721417 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.544242}, mono={5.120000}: clock_override_add
sys={28.544242}, mono={5.120000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16580 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16578 -> 16580 (1 lost packets)
sys={28.544242}, mono={5.120000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16581 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16579 -> 16581 (1 lost packets)
sys={28.544242}, mono={5.120000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16582 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16580 -> 16582 (1 lost packets)
sys={28.544242}, mono={5.120000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16583 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.544242}, mono={5.120000}: OSMUX message (len=98): OSMUX seq=092 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=093 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9689 timestamp=1681777737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9690 timestamp=1681777897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9691 timestamp=1681778057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9692 timestamp=1681778217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9693 timestamp=1681778377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16581 -> 16583 (1 lost packets)
+sys={28.544242}, mono={5.120000}: OSMUX message (len=128): OSMUX seq=014 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=014 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9338 timestamp=1681721577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9339 timestamp=1681721737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9340 timestamp=1681721897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9338 timestamp=1681721577 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9339 timestamp=1681721737 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.544242}, mono={5.120000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9340 timestamp=1681721897 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.564242}, mono={5.140000}: clock_override_add
-sys={28.564242}, mono={5.140000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9694 timestamp=1681778537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.564242}, mono={5.140000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9341 timestamp=1681722057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.564242}, mono={5.140000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9341 timestamp=1681722057 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.584242}, mono={5.160000}: clock_override_add
sys={28.584242}, mono={5.160000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16584 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,0/1472][CID=1,batched=0/4] RTP seq jump detected: 16582 -> 16584 (1 lost packets)
sys={28.584242}, mono={5.160000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16585 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,34/1472][CID=0,batched=0/4] RTP seq jump detected: 16583 -> 16585 (1 lost packets)
sys={28.584242}, mono={5.160000}: adding to ccid=1 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16586 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
+DLMUX [second,68/1472][CID=1,batched=2/4] RTP seq jump detected: 16584 -> 16586 (1 lost packets)
sys={28.584242}, mono={5.160000}: adding to ccid=0 RTP ver=2 ssrc=118030434 type=98 marker=0 ext=0 csrc_count=0 sequence=16587 timestamp=108399 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-DLMUX adding cloned RTP
-sys={28.584242}, mono={5.160000}: OSMUX message (len=98): OSMUX seq=094 ccid=000 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=095 ccid=001 ft=1 ctr=2 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9695 timestamp=1681778697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9696 timestamp=1681778857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9697 timestamp=1681779017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9698 timestamp=1681779177 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
-sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9699 timestamp=1681779337 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+DLMUX [second,98/1472][CID=0,batched=2/4] RTP seq jump detected: 16585 -> 16587 (1 lost packets)
+sys={28.584242}, mono={5.160000}: OSMUX message (len=128): OSMUX seq=015 ccid=000 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ], OSMUX seq=015 ccid=001 ft=1 rtp_m=0 ctr=3 amr_f=0 amr_q=1 amr_ft=02 amr_cmr=02 [ ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9342 timestamp=1681722217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9343 timestamp=1681722377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9344 timestamp=1681722537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9342 timestamp=1681722217 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9343 timestamp=1681722377 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.584242}, mono={5.160000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9344 timestamp=1681722537 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.604242}, mono={5.180000}: clock_override_add
-sys={28.604242}, mono={5.180000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9700 timestamp=1681779497 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.604242}, mono={5.180000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9345 timestamp=1681722697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.604242}, mono={5.180000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9345 timestamp=1681722697 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
sys={28.624242}, mono={5.200000}: clock_override_add
+DLMUX [second,0/1472][CID=0,batched=0/4] Closing circuit
+DLMUX [second,0/1472][CID=1,batched=0/4] Closing circuit
+sys={28.624242}, mono={5.200000}: Flushing CID 0
+sys={28.624242}, mono={5.200000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9346 timestamp=1681722857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.624242}, mono={5.200000}: extracted packet: RTP ver=2 ssrc=117440512 type=98 marker=0 ext=0 csrc_count=0 sequence=9347 timestamp=1681723017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.624242}, mono={5.200000}: Flushing CID 1
+sys={28.624242}, mono={5.200000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9346 timestamp=1681722857 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.624242}, mono={5.200000}: extracted packet: RTP ver=2 ssrc=117440513 type=98 marker=0 ext=0 csrc_count=0 sequence=9347 timestamp=1681723017 [20 14 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ]
+sys={28.624242}, mono={5.200000}: Flushing CID 2
+sys={28.624242}, mono={5.200000}: Flushing CID 3
sys={28.624242}, mono={5.200000}: OK: Test passed
diff --git a/tests/stream/stream_test.c b/tests/stream/stream_test.c
index b4846bc..6e849ca 100644
--- a/tests/stream/stream_test.c
+++ b/tests/stream/stream_test.c
@@ -1,6 +1,7 @@
/*
- * (C) 2019 by sysmocom - s.f.m.c. GmbH.
- * Author: Max Suraev
+ * (C) 2023 by sysmocom - s.f.m.c. GmbH.
+ * Authors: Max Suraev
+ * Alexander Rehbein
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -8,19 +9,23 @@
* (at your option) any later version.
*/
+#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
+#include <osmocom/core/byteswap.h>
#include <osmocom/core/select.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/application.h>
#include <osmocom/core/timer.h>
+#include <osmocom/gsm/protocol/ipaccess.h>
+#include <osmocom/netif/ipa.h>
#include <osmocom/netif/stream.h>
#define RECONNECT_TIMEOUT_SECS 9
@@ -116,6 +121,7 @@ static int read_cb_cli(struct osmo_stream_cli *cli)
osmo_stream_cli_set_data(cli, msg);
CLI_SND(cli, "Doh, responding to server :-D");
}
+ msgb_free(msg);
return 0;
}
@@ -214,6 +220,8 @@ static struct osmo_stream_cli *make_client(void *ctx, const char *host, unsigned
printf("Prepare %s stream client...\n", ASTR(autoreconnect));
+ osmo_stream_cli_set_local_port(cli, 8976);
+ osmo_stream_cli_set_name(cli, "cli_test");
osmo_stream_cli_set_addr(cli, host);
osmo_stream_cli_set_port(cli, port);
osmo_stream_cli_set_connect_cb(cli, connect_cb_cli);
@@ -292,6 +300,7 @@ int read_cb_srv(struct osmo_stream_srv *srv)
than it must be subsequent (after reconnect) call */
request_test_stop(srv);
}
+ msgb_free(msg);
osmo_stream_srv_destroy(srv);
return -EINVAL;
} else {
@@ -323,6 +332,7 @@ static int accept_cb_srv(struct osmo_stream_srv_link *lnk, int fd)
LOGLNK(lnk, "error while creating connection\n");
return -EINVAL;
}
+ osmo_stream_srv_set_name(srv, "srv_test");
return 0;
}
@@ -332,10 +342,17 @@ static void test_recon(void *ctx, const char *host, unsigned port, unsigned step
bool autoreconnect)
{
struct timeval tv;
- struct osmo_stream_cli *cli = make_client(ctx, host, port, autoreconnect);
+ struct osmo_stream_cli *cli;
+ if (osmo_stream_srv_link_open(lnk) < 0) {
+ printf("Unable to open server\n");
+ osmo_stream_srv_link_destroy(lnk);
+ return;
+ }
+ cli = make_client(ctx, host, port, autoreconnect);
if (!cli)
return;
+
printf("=======================================\n");
printf("Client/Server entering %s event loop...\n", ASTR(autoreconnect));
printf("=======================================\n");
@@ -360,12 +377,525 @@ static void test_recon(void *ctx, const char *host, unsigned port, unsigned step
}
osmo_stream_cli_destroy(cli);
+ osmo_stream_srv_link_close(lnk);
printf("{%lu.%06lu} %s test complete.\n\n", tv.tv_sec, tv.tv_usec, ASTR(autoreconnect));
}
+/* Segmentation test code (using IPA) */
+#define IPAC_MSG_PING_LEN 0x01
+static const uint8_t ipac_msg_ping[] = {
+ 0x00, IPAC_MSG_PING_LEN,
+ IPAC_PROTO_IPACCESS,
+ IPAC_MSGT_PING
+};
+#define IPAC_MSG_PONG_LEN 0x01
+static const uint8_t ipac_msg_pong[] = {
+ 0x00, IPAC_MSG_PONG_LEN,
+ IPAC_PROTO_IPACCESS,
+ IPAC_MSGT_PONG
+};
+#define IPAC_MSG_IDREQ_PAYLOAD_INITIALIZER \
+ IPAC_MSGT_ID_GET, \
+ 0x01, IPAC_IDTAG_UNITNAME
+static const uint8_t ipac_msg_idreq_payload[] = {
+ IPAC_MSG_IDREQ_PAYLOAD_INITIALIZER
+};
+#define IPAC_MSG_ID_REQ_LEN 0x03
+static const uint8_t ipac_msg_idreq[] = {
+ 0x00, IPAC_MSG_ID_REQ_LEN,
+ IPAC_PROTO_IPACCESS,
+ IPAC_MSG_IDREQ_PAYLOAD_INITIALIZER
+};
+#define ipac_msg_idreq_third (sizeof(ipac_msg_idreq)/3)
+#define ipac_msg_idreq_last_third (sizeof(ipac_msg_idreq) - 2 * ipac_msg_idreq_third)
+#define IPAC_MSG_ID_RESP_LEN 0x07
+static const uint8_t ipac_msg_idresp[] = {
+ 0x00, IPAC_MSG_ID_RESP_LEN,
+ IPAC_PROTO_IPACCESS,
+ IPAC_MSGT_ID_RESP,
+ 0x01, IPAC_IDTAG_UNITNAME, 0xde, 0xad, 0xbe, 0xef
+};
+
+#define put_ipa_msg(unsigned_char_ptr, struct_msgb_ptr, byte_array) do {\
+ (unsigned_char_ptr) = msgb_put(struct_msgb_ptr, sizeof(byte_array));\
+ memcpy(unsigned_char_ptr, byte_array, sizeof(byte_array));\
+} while (0)
+
+/* Array indices correspond to enum values stringified on the right */
+static const char * const IPAC_MSG_TYPES[] = {
+ [0] = "IPAC_MSGT_PING",
+ [1] = "IPAC_MSGT_PONG",
+ [2] = "UNEXPECTED VALUE",
+ [3] = "UNEXPECTED VALUE",
+ [4] = "IPAC_MSGT_ID_GET",
+ [5] = "IPAC_MSGT_ID_RESP",
+};
+
+#define IPAC_MSGT_OFFSET 3
+/* Append a message to UCHAR_PTR_DST. SRC_IPAC_MSG_BUF is expected to be a
+ * buffer containing an IPA message of type IPAC_PROTO_ACCESS that is
+ * syntactically correct up to offset 3 (IPAC_MSGT_OFFSET).
+ * Uses a counter so that appended messages can be distinguished easily in the logs */
+#define CLI_APPEND_MSG(OSMO_STREAM_CLI_PTR, UCHAR_PTR_DST, STRUCT_MSGB_PTR, SRC_IPAC_MSG_BUF) do {\
+ LOGCLI(OSMO_STREAM_CLI_PTR, "[%u-cli] Appending msg of type %s into buffer\n",\
+ ++test_segm_ipa_stream_srv_msglognum_cli, IPAC_MSG_TYPES[SRC_IPAC_MSG_BUF[IPAC_MSGT_OFFSET]]);\
+ LOGCLI(OSMO_STREAM_CLI_PTR, "\t(msg dump: %s)\n", osmo_hexdump(SRC_IPAC_MSG_BUF,\
+ sizeof(SRC_IPAC_MSG_BUF)));\
+ put_ipa_msg(UCHAR_PTR_DST, STRUCT_MSGB_PTR, SRC_IPAC_MSG_BUF);\
+} while (0)
+
+static unsigned test_segm_ipa_stream_srv_msglognum_cli = 0;
+static int test_segm_ipa_stream_srv_cli_connect_cb(struct osmo_stream_cli *cli)
+{
+ unsigned char *data;
+ struct msgb *m = msgb_alloc_headroom(128, 0, "IPA messages");
+ if (m == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return -ENOMEM;
+ }
+
+ /* Send 4 and 1/3 messages */
+ /* Append 4 */
+ CLI_APPEND_MSG(cli, data, m, ipac_msg_ping);
+ CLI_APPEND_MSG(cli, data, m, ipac_msg_pong);
+ CLI_APPEND_MSG(cli, data, m, ipac_msg_ping);
+ CLI_APPEND_MSG(cli, data, m, ipac_msg_idresp);
+ /* Append 1/3 */
+ LOGCLI(cli, "[(0%u + 1/3)-cli] Appending 1st third of msg of type %s into buffer\n",
+ test_segm_ipa_stream_srv_msglognum_cli, IPAC_MSG_TYPES[ipac_msg_idreq[3]]);
+ LOGCLI(cli, "\t(dump: %s)\n", osmo_hexdump(ipac_msg_idreq, ipac_msg_idreq_third));
+ data = msgb_put(m, ipac_msg_idreq_third);
+ memcpy(data, ipac_msg_idreq, ipac_msg_idreq_third);
+
+ LOGCLI(cli, "Sending 4 + 1/3 messages as one:\n");
+ LOGCLI(cli, "\t(msg dump: %s)\n\n", osmo_hexdump(m->data, m->len));
+ osmo_stream_cli_send(cli, m);
+ return 0;
+}
+
+static bool test_segm_ipa_stream_srv_all_msgs_processed = false;
+
+static void send_last_third(void *osmo_stream_cli_arg)
+{
+ struct osmo_stream_cli *osc = osmo_stream_cli_arg;
+ unsigned char *data;
+ struct msgb *reply = msgb_alloc_headroom(128, 0, "IPA delayed reply");
+
+ LOGCLI(osc, "Delay for sending last third of message is over\n");
+ if (reply == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return;
+ }
+ LOGCLI(osc, "[%u-cli] Appending: Last third of IPAC_MSGT_ID_GET\n",
+ ++test_segm_ipa_stream_srv_msglognum_cli);
+ data = msgb_put(reply, ipac_msg_idreq_last_third);
+ memcpy(data, ipac_msg_idreq + 2 * ipac_msg_idreq_third,
+ ipac_msg_idreq_last_third);
+ /* Append two entire messages */
+ CLI_APPEND_MSG(osc, data, reply, ipac_msg_pong);
+ CLI_APPEND_MSG(osc, data, reply, ipac_msg_pong);
+ LOGCLI(osc, "\tSending:"
+ "[ Last third of IPAC_MSGT_ID_GET | IPAC_MSGT_PONG | IPAC_MSGT_PONG ]\n");
+ LOGCLI(osc, "\t(msg dump: %s)\n\n", osmo_hexdump(reply->data, reply->len));
+ osmo_stream_cli_send(osc, reply);
+}
+
+static struct osmo_timer_list fragmented_send_tl_cli;
+
+static int test_segm_ipa_stream_srv_cli_read_cb(struct osmo_stream_cli *osc, int res, struct msgb *msg)
+{
+ unsigned char *data;
+ struct ipa_head *h = (struct ipa_head *) msg->l1h;
+ uint8_t ipac_msg_type = *msg->data;
+ struct msgb *reply;
+
+ if (res < 0) {
+ fprintf(stderr, "cannot receive message (res = %d)\n", res);
+ msgb_free(msg);
+ return -ENOMSG;
+ }
+
+ LOGCLI(osc, "Received message from stream (payload len = %" PRIu16 ")\n", msgb_length(msg));
+ if (ipac_msg_type < 0 || 5 < ipac_msg_type) {
+ fprintf(stderr, "Received unexpected IPAC message type %"PRIu8"\n", ipac_msg_type);
+ msgb_free(msg);
+ return -ENOMSG;
+ }
+ LOGCLI(osc, "\tType: %s\n", IPAC_MSG_TYPES[ipac_msg_type]);
+ if (ipac_msg_type == IPAC_MSGT_ID_GET) {
+ LOGCLI(osc, "Got IPAC_MSGT_ID_GET from server\n");
+ LOGCLI(osc, "[(%u + 2/3) -cli] Appending: Second third of IPAC_MSGT_ID_GET\n",
+ test_segm_ipa_stream_srv_msglognum_cli);
+ reply = msgb_alloc_headroom(128, 0, "IPA reply");
+ if (reply == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return -ENOMEM;
+ }
+ data = msgb_put(reply, ipac_msg_idreq_third);
+ memcpy(data, ipac_msg_idreq + ipac_msg_idreq_third,
+ ipac_msg_idreq_third);
+ LOGCLI(osc, "\tSending: Second third of IPAC_MSGT_ID_GET\n");
+ LOGCLI(osc, "\t(msg dump: %s)\n", osmo_hexdump(reply->data, reply->len));
+ osmo_stream_cli_send(osc, reply);
+ osmo_timer_setup(&fragmented_send_tl_cli, send_last_third, osc);
+ osmo_timer_add(&fragmented_send_tl_cli);
+ osmo_timer_schedule(&fragmented_send_tl_cli, 0, 500000);
+ } else if (ipac_msg_type == IPAC_MSGT_ID_RESP) {
+ LOGCLI(osc, "\tresult= %s\n",
+ osmo_hexdump((const unsigned char *)h, sizeof(*h) + h->len));
+ LOGCLI(osc, "\texpected=%s\n",
+ osmo_hexdump(ipac_msg_idresp, sizeof(ipac_msg_idresp)));
+ }
+ msgb_free(msg);
+ printf("\n");
+ return 0;
+}
+
+struct osmo_stream_cli *test_segm_ipa_stream_srv_run_client(void *ctx)
+{
+ struct osmo_stream_cli *osc = osmo_stream_cli_create(ctx);
+ if (osc == NULL) {
+ fprintf(stderr, "osmo_stream_cli_create_iofd()\n");
+ return NULL;
+ }
+ osmo_stream_cli_set_addr(osc, "127.0.0.11");
+ osmo_stream_cli_set_local_port(osc, 8977);
+ osmo_stream_cli_set_port(osc, 1111);
+ osmo_stream_cli_set_connect_cb(osc, test_segm_ipa_stream_srv_cli_connect_cb);
+ osmo_stream_cli_set_read_cb2(osc, test_segm_ipa_stream_srv_cli_read_cb);
+ osmo_stream_cli_set_nodelay(osc, true);
+ if (osmo_stream_cli_open(osc) < 0) {
+ fprintf(stderr, "Cannot open stream client\n");
+ return NULL;
+ }
+ osmo_stream_cli_set_segmentation_cb(osc, osmo_ipa_segmentation_cb);
+
+ return osc;
+}
+
+int test_segm_ipa_stream_srv_srv_read_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg)
+{
+ static unsigned msgnum_srv = 0;
+ struct ipa_head *ih = (struct ipa_head *)msg->l1h;
+ unsigned char *data;
+ struct msgb *m;
+ uint8_t msgt;
+
+ if (res <= 0) {
+ if (res < 0)
+ LOGSRV(conn, "cannot receive message: %s\n", strerror(-res));
+ else
+ LOGSRV(conn, "client closed connection\n");
+ msgb_free(msg);
+ osmo_stream_srv_destroy(conn);
+ return -EBADF;
+ }
+
+ LOGSRV(conn, "[%u-srv] Received IPA message from stream (payload len = %" PRIu16 ")\n",
+ ++msgnum_srv, msgb_length(msg));
+ LOGSRV(conn, "\tmsg buff data (including stripped headers): %s\n",
+ osmo_hexdump((unsigned char *)ih, osmo_ntohs(ih->len) + sizeof(*ih)));
+ LOGSRV(conn, "\tIPA payload: %s\n", osmo_hexdump(ih->data, osmo_ntohs(ih->len)));
+
+ msgt = *msg->l2h; /* Octet right after IPA header */
+ LOGSRV(conn, "\tType: %s\n", IPAC_MSG_TYPES[msgt]);
+ LOGSRV(conn, "\t(msg dump: %s)\n", osmo_hexdump(msg->l1h, msg->len + sizeof(struct ipa_head)));
+
+ msgb_free(msg);
+
+ if (msgt == IPAC_MSGT_ID_RESP) { /* */
+ LOGSRV(conn, "Send IPAC_MSGT_ID_GET to trigger client to send next third\n\n");
+ m = osmo_ipa_msg_alloc(128);
+ if (m == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return -ENOMEM;
+ }
+ put_ipa_msg(data, m, ipac_msg_idreq_payload);
+ osmo_ipa_msg_push_headers(m, IPAC_PROTO_IPACCESS, -1);
+ osmo_stream_srv_send(conn, m);
+ } else if (msgnum_srv == 7 && msgt == IPAC_MSGT_PONG) {
+ test_segm_ipa_stream_srv_all_msgs_processed = true;
+ osmo_stream_srv_destroy(conn);
+ }
+ return 0;
+}
+
+static int test_segm_ipa_stream_srv_srv_accept_cb(struct osmo_stream_srv_link *srv, int fd)
+{
+ void *ctx = osmo_stream_srv_link_get_data(srv);
+ struct osmo_stream_srv *oss =
+ osmo_stream_srv_create2(ctx, srv, fd, NULL);
+ if (oss == NULL) {
+ fprintf(stderr, "Error while creating connection\n");
+ return -1;
+ }
+ osmo_stream_srv_set_segmentation_cb(oss, osmo_ipa_segmentation_cb);
+ osmo_stream_srv_set_read_cb(oss, test_segm_ipa_stream_srv_srv_read_cb);
+ return 0;
+}
+
+static void test_segm_ipa_stream_srv_run(void *ctx, const char *host, unsigned port,
+ struct osmo_stream_srv_link *srv)
+{
+ struct osmo_stream_cli *osc;
+ const char *testname = "test_segm_ipa_stream_srv";
+ osmo_stream_srv_link_set_accept_cb(srv,
+ test_segm_ipa_stream_srv_srv_accept_cb);
+ if (osmo_stream_srv_link_open(srv) < 0) {
+ printf("Unable to open server\n");
+ exit(1);
+ }
+ osc = test_segm_ipa_stream_srv_run_client(ctx);
+
+ printf("______________________________________Running test %s______________________________________\n", testname);
+ alarm(2);
+
+ while (!test_segm_ipa_stream_srv_all_msgs_processed) {
+ osmo_gettimeofday_override_add(0, 1); /* small increment to easily spot iterations */
+ osmo_select_main(1);
+ }
+ alarm(0);
+ printf("==================================Test %s complete========================================\n\n", testname);
+ if (osc)
+ osmo_stream_cli_destroy(osc);
+ osmo_stream_srv_link_close(srv);
+}
+
+static void sigalarm_handler(int _foo)
+{
+ printf("FAIL: test did not run successfully\n");
+ exit(EXIT_FAILURE);
+}
+
+static struct osmo_timer_list fragmented_send_tl_srv;
+static struct osmo_timer_list fragmented_send_tl_srv_destroy;
+
+static unsigned test_segm_ipa_stream_cli_srv_msglognum = 0;
+
+/* Like CLI_APPEND_MSG, but for server side */
+#define SRV_APPEND_MSG(OSMO_STREAM_SRV_PTR, UCHAR_PTR_DST, STRUCT_MSGB_PTR, SRC_IPAC_MSG_BUF) do {\
+ LOGSRV(OSMO_STREAM_SRV_PTR, "[%u-srv] Appending msg of type %s into buffer\n",\
+ ++test_segm_ipa_stream_cli_srv_msglognum, IPAC_MSG_TYPES[SRC_IPAC_MSG_BUF[IPAC_MSGT_OFFSET]]);\
+ LOGSRV(OSMO_STREAM_SRV_PTR, "\t(msg dump: %s)\n", osmo_hexdump(SRC_IPAC_MSG_BUF,\
+ sizeof(SRC_IPAC_MSG_BUF)));\
+ put_ipa_msg(UCHAR_PTR_DST, STRUCT_MSGB_PTR, SRC_IPAC_MSG_BUF);\
+} while (0)
+
+static void destroy_conn(void *osmo_stream_srv_arg)
+{
+ osmo_stream_srv_destroy(osmo_stream_srv_arg);
+}
+
+static void send_last_third_srv(void *osmo_stream_srv_arg)
+{
+ struct osmo_stream_srv *oss = osmo_stream_srv_arg;
+ unsigned char *data;
+ struct msgb *reply = msgb_alloc_headroom(128, 0, "IPA delayed reply");
+
+ LOGSRV(oss, "Delay for sending last third of message is over\n");
+ if (reply == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return;
+ }
+ LOGSRV(oss, "[%u-srv] Appending: Last third of IPAC_MSGT_ID_GET\n",
+ ++test_segm_ipa_stream_cli_srv_msglognum);
+ data = msgb_put(reply, ipac_msg_idreq_last_third);
+ memcpy(data, ipac_msg_idreq + 2 * ipac_msg_idreq_third,
+ ipac_msg_idreq_last_third);
+ /* Append two entire messages */
+ SRV_APPEND_MSG(oss, data, reply, ipac_msg_pong);
+ SRV_APPEND_MSG(oss, data, reply, ipac_msg_pong);
+ LOGSRV(oss, "\tSending:"
+ "[ Last third of IPAC_MSGT_ID_GET | IPAC_MSGT_PONG | IPAC_MSGT_PONG ]\n");
+ LOGSRV(oss, "\t(msg dump: %s)\n\n", osmo_hexdump(reply->data, reply->len));
+ osmo_stream_srv_send(oss, reply);
+ osmo_timer_setup(&fragmented_send_tl_srv_destroy, destroy_conn, oss);
+ osmo_timer_add(&fragmented_send_tl_srv_destroy);
+ /* 2 select loop iterations needed, timing only 1 will leave the client side hanging while waiting
+ * to receive the last messages */
+ osmo_timer_schedule(&fragmented_send_tl_srv_destroy, 0, 2);
+}
+
+int test_segm_ipa_stream_cli_srv_read_cb(struct osmo_stream_srv *conn, int res, struct msgb *msg)
+{
+ unsigned char *data;
+ struct ipa_head *h = (struct ipa_head *) msg->l1h;
+ uint8_t ipa_msg_type;
+ struct msgb *reply;
+
+ if (res <= 0) {
+ if (res < 0)
+ LOGSRV(conn, "cannot receive message: %s\n", strerror(-res));
+ else
+ LOGSRV(conn, "client closed connection\n");
+ msgb_free(msg);
+ osmo_stream_srv_destroy(conn);
+ return -EBADF;
+ }
+
+ ipa_msg_type = ((uint8_t *)h)[sizeof(struct ipa_head)];
+
+ reply = msgb_alloc_headroom(128, 0, "IPA reply");
+ if (reply == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return -ENOMEM;
+ }
+ LOGSRV(conn, "Received message from stream (total len including stripped headers = %lu)\n",
+ osmo_ntohs(h->len) + sizeof(*h));
+ if (5 < ipa_msg_type) {
+ fprintf(stderr, "Received unexpected IPAC message type %"PRIu8"\n", ipa_msg_type);
+ return -ENOMSG;
+ }
+ LOGSRV(conn, "\tType: %s\n", IPAC_MSG_TYPES[ipa_msg_type]);
+ if (ipa_msg_type == IPAC_MSGT_ID_GET) {
+ LOGSRV(conn, "Got IPAC_MSGT_ID_GET from client\n");
+ LOGSRV(conn, "[(%u + 2/3) -srv] Appending: Second third of IPAC_MSGT_ID_GET\n",
+ test_segm_ipa_stream_cli_srv_msglognum);
+ data = msgb_put(reply, ipac_msg_idreq_third);
+ memcpy(data, ipac_msg_idreq + ipac_msg_idreq_third,
+ ipac_msg_idreq_third);
+ LOGSRV(conn, "\tSending: Second third of IPAC_MSGT_ID_GET\n");
+ LOGSRV(conn, "\t(msg dump: %s)\n", osmo_hexdump(reply->data, reply->len));
+ osmo_stream_srv_send(conn, reply);
+ osmo_timer_setup(&fragmented_send_tl_srv, send_last_third_srv, conn);
+ osmo_timer_add(&fragmented_send_tl_srv);
+ osmo_timer_schedule(&fragmented_send_tl_srv, 0, 125000);
+ } else if (ipa_msg_type == IPAC_MSGT_ID_RESP) {
+ LOGSRV(conn, "\tresult= %s\n",
+ osmo_hexdump((const unsigned char *)h, sizeof(*h) + h->len));
+ LOGSRV(conn, "\texpected=%s\n",
+ osmo_hexdump(ipac_msg_idresp, sizeof(ipac_msg_idresp)));
+ }
+ printf("\n");
+ return 0;
+}
+
+static int test_segm_ipa_stream_cli_srv_accept_cb(struct osmo_stream_srv_link *srv, int fd)
+{
+ void *ctx = osmo_stream_srv_link_get_data(srv);
+ struct osmo_stream_srv *oss =
+ osmo_stream_srv_create2(ctx, srv, fd, NULL);
+ unsigned char *data;
+ struct msgb *m = msgb_alloc_headroom(128, 0, "IPA messages");
+ if (oss == NULL) {
+ fprintf(stderr, "Error while creating connection\n");
+ return -1;
+ }
+ if (m == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return -ENOMEM;
+ }
+ osmo_stream_srv_set_segmentation_cb(oss, osmo_ipa_segmentation_cb);
+ osmo_stream_srv_set_read_cb(oss, test_segm_ipa_stream_cli_srv_read_cb);
+
+ /* Send 4 and 1/3 messages, as done analogously in test_segm_ipa_stream_srv_cli_connect_cb() */
+ /* Append 4 */
+ SRV_APPEND_MSG(oss, data, m, ipac_msg_ping);
+ SRV_APPEND_MSG(oss, data, m, ipac_msg_pong);
+ SRV_APPEND_MSG(oss, data, m, ipac_msg_ping);
+ SRV_APPEND_MSG(oss, data, m, ipac_msg_idresp);
+ /* Append 1/3 */
+ LOGSRV(oss, "[(0%u + 1/3)-srv] Appending 1st third of msg of type %s into buffer\n",
+ test_segm_ipa_stream_cli_srv_msglognum, IPAC_MSG_TYPES[ipac_msg_idreq[3]]);
+ LOGSRV(oss, "\t(dump: %s)\n", osmo_hexdump(ipac_msg_idreq, ipac_msg_idreq_third));
+ data = msgb_put(m, ipac_msg_idreq_third);
+ memcpy(data, ipac_msg_idreq, ipac_msg_idreq_third);
+
+ LOGSRV(oss, "Sending 4 + 1/3 messages as one:\n");
+ LOGSRV(oss, "\t(msg dump: %s)\n\n", osmo_hexdump(m->data, m->len));
+ osmo_stream_srv_send(oss, m);
+ return 0;
+}
+
+static bool test_segm_ipa_stream_cli_all_msgs_processed = false;
+
+static int test_segm_ipa_stream_cli_cli_read_cb(struct osmo_stream_cli *osc, int res, struct msgb *msg)
+{
+ static unsigned msgnum_cli = 0;
+ unsigned char *data;
+ struct msgb *m;
+ uint8_t *msgt = msg->data;
+ LOGCLI(osc, "[%u-cli] Received message from stream (len = %" PRIu16 ")\n",
+ ++msgnum_cli, msgb_length(msg));
+ LOGCLI(osc, "\tmsg buff data: %s\n", osmo_hexdump(msg->data, msg->len));
+ LOGCLI(osc, "\tIPA payload: %s\n", osmo_hexdump(msg->data, msg->len));
+ LOGCLI(osc, "\tType: %s\n", IPAC_MSG_TYPES[*msgt]);
+ LOGCLI(osc, "\t(msg dump (including stripped headers): %s)\n",
+ osmo_hexdump(msg->l1h, sizeof(struct ipa_head) + msg->len));
+ if (*msgt == IPAC_MSGT_ID_RESP) {
+ LOGCLI(osc, "Send IPAC_MSGT_ID_GET to trigger server to send next third\n\n");
+ m = msgb_alloc_headroom(128, sizeof(struct ipa_head) +
+ sizeof(struct ipa_head_ext), "IPA messages");
+ if (m == NULL) {
+ fprintf(stderr, "Cannot allocate message\n");
+ return -ENOMEM;
+ }
+ put_ipa_msg(data, m, ipac_msg_idreq_payload);
+ osmo_ipa_msg_push_headers(m, IPAC_PROTO_IPACCESS, -1);
+ osmo_stream_cli_send(osc, m);
+ } else if (msgnum_cli == 7 && *msgt == IPAC_MSGT_PONG) {
+ test_segm_ipa_stream_cli_all_msgs_processed = true;
+ }
+ return 0;
+}
+
+static struct osmo_stream_cli *test_segm_ipa_stream_cli_run_client(void *ctx)
+{
+ struct osmo_stream_cli *osc = osmo_stream_cli_create(ctx);
+ if (osc == NULL) {
+ fprintf(stderr, "osmo_stream_cli_create_iofd()\n");
+ return NULL;
+ }
+ osmo_stream_cli_set_addr(osc, "127.0.0.11");
+ osmo_stream_cli_set_local_port(osc, 8977);
+ osmo_stream_cli_set_port(osc, 1112);
+ osmo_stream_cli_set_read_cb2(osc, test_segm_ipa_stream_cli_cli_read_cb);
+ osmo_stream_cli_set_nodelay(osc, true);
+ osmo_stream_cli_set_segmentation_cb(osc, osmo_ipa_segmentation_cb);
+ if (osmo_stream_cli_open(osc) < 0) {
+ fprintf(stderr, "Cannot open stream client\n");
+ return NULL;
+ }
+
+ return osc;
+}
+
+static void test_segm_ipa_stream_cli_run(void *ctx, const char *host, unsigned port,
+ struct osmo_stream_srv_link *srv)
+{
+ const char *testname = "test_segm_ipa_stream_cli";
+ struct osmo_stream_cli *osc = NULL;
+ osmo_stream_srv_link_set_accept_cb(srv,
+ test_segm_ipa_stream_cli_srv_accept_cb);
+ osmo_stream_srv_link_set_port(srv, 1112);
+ if (osmo_stream_srv_link_open(srv) < 0) {
+ printf("Unable to open server\n");
+ exit(1);
+ }
+ osc = test_segm_ipa_stream_cli_run_client(ctx);
+
+ printf("______________________________________Running test %s______________________________________\n", testname);
+ alarm(2);
+
+ while (!test_segm_ipa_stream_cli_all_msgs_processed) {
+ osmo_gettimeofday_override_add(0, 1); /* small increment to easily spot iterations */
+ osmo_select_main(1);
+ }
+ alarm(0);
+ printf("==================================Test %s complete========================================\n\n", testname);
+ if (osc)
+ osmo_stream_cli_destroy(osc);
+ osmo_stream_srv_link_close(srv);
+}
int main(void)
{
+
+ if (signal(SIGALRM, sigalarm_handler) == SIG_ERR) {
+ perror("signal");
+ exit(EXIT_FAILURE);
+ }
+
struct osmo_stream_srv_link *srv;
char *host = "127.0.0.11";
unsigned port = 1111;
@@ -375,12 +905,12 @@ int main(void)
osmo_gettimeofday_override_time.tv_sec = 2;
osmo_gettimeofday_override_time.tv_usec = 0;
- msgb_talloc_ctx_init(tall_test, 0);
osmo_init_logging2(tall_test, &osmo_stream_test_log_info);
log_set_log_level(osmo_stderr_target, LOGL_INFO);
log_set_use_color(osmo_stderr_target, 0);
log_set_print_category_hex(osmo_stderr_target, 0);
- log_set_print_filename(osmo_stderr_target, 0);
+ log_set_print_category(osmo_stderr_target, 0);
+ log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_NONE);
printf("Preparing stream server...\n");
srv = osmo_stream_srv_link_create(tall_test);
@@ -389,20 +919,23 @@ int main(void)
return EXIT_FAILURE;
}
+ osmo_stream_srv_link_set_name(srv, "srv_link_test");
osmo_stream_srv_link_set_addr(srv, host);
osmo_stream_srv_link_set_port(srv, port);
osmo_stream_srv_link_set_accept_cb(srv, accept_cb_srv);
-
- if (osmo_stream_srv_link_open(srv) < 0) {
- printf("Unable to open server\n");
- return EXIT_FAILURE;
- }
+ osmo_stream_srv_link_set_nodelay(srv, true);
test_recon(tall_test, host, port, 12, srv, true);
test_recon(tall_test, host, port, 8, srv, false);
- osmo_stream_srv_link_destroy(srv);
+ osmo_stream_srv_link_set_data(srv, tall_test);
+ test_segm_ipa_stream_srv_run(tall_test, host, port, srv);
+ test_segm_ipa_stream_cli_run(tall_test, host, port, srv);
+
printf("Stream tests completed\n");
+ osmo_stream_srv_link_destroy(srv);
+ log_fini();
+ talloc_free(tall_test);
return EXIT_SUCCESS;
}
diff --git a/tests/stream/stream_test.err b/tests/stream/stream_test.err
index 0d08c67..6c85c43 100644
--- a/tests/stream/stream_test.err
+++ b/tests/stream/stream_test.err
@@ -1,3 +1,5 @@
+SRV(srv_link_test,127.0.0.11:1111) accept()ed new link from 127.0.0.1:8976
+CLICONN(cli_test,r=127.0.0.11:1111<->l=127.0.0.1:8976){CONNECTING} connection established
{2.000001} autoreconnecting test step 11 [client NA, server OK], FD reg 1
@@ -12,17 +14,21 @@
{2.000006} autoreconnecting test step 6 [client OK, server OK], FD reg 1
{2.000007} autoreconnecting test step 5 [client OK, server OK], FD reg 1
-[CONNECTED] osmo_stream_cli_recv(): connection closed with srv
-[WAIT_RECONNECT] osmo_stream_cli_reconnect(): retrying in 9 seconds...
+CLICONN(cli_test,r=127.0.0.11:1111<->l=127.0.0.1:8976){CONNECTED} connection closed with srv
+CLICONN(cli_test,r=127.0.0.11:1111<->l=127.0.0.1:8976){WAIT_RECONNECT} retrying reconnect in 9 seconds...
{11.000008} autoreconnecting test step 4 [client OK, server OK], FD reg 0
{11.000009} autoreconnecting test step 3 [client OK, server OK], FD reg 1
+SRV(srv_link_test,127.0.0.11:1111) accept()ed new link from 127.0.0.1:8976
+CLICONN(cli_test,r=127.0.0.11:1111<->l=127.0.0.1:8976){CONNECTING} connection established
{11.000010} autoreconnecting test step 2 [client OK, server OK], FD reg 0
-connection closed with srv
+SRVCONN(srv_test,r=127.0.0.1:8976<->l=127.0.0.11:1111) connection closed with client
{11.000011} autoreconnecting test step 1 [client OK, server NA], FD reg 0
+SRV(srv_link_test,127.0.0.11:1111) accept()ed new link from 127.0.0.1:8976
+CLICONN(cli_test,r=127.0.0.11:1111<->l=127.0.0.1:8976){CONNECTING} connection established
{11.000012} non-reconnecting test step 7 [client NA, server OK], FD reg 1
@@ -37,7 +43,11 @@ connection closed with srv
{11.000017} non-reconnecting test step 2 [client OK, server OK], FD reg 1
{11.000018} non-reconnecting test step 1 [client OK, server OK], FD reg 1
-[CONNECTED] osmo_stream_cli_recv(): connection closed with srv
-[CLOSED] osmo_stream_cli_reconnect(): not reconnecting, disabled.
+CLICONN(cli_test,r=127.0.0.11:1111<->l=127.0.0.1:8976){CONNECTED} connection closed with srv
+CLICONN(cli_test,r=127.0.0.11:1111<->l=127.0.0.1:8976){CLOSED} not reconnecting, disabled
{20.000019} non-reconnecting test step 0 [client OK, server OK], FD reg 0
+SRV(srv_link_test,127.0.0.11:1111) accept()ed new link from 127.0.0.1:8977
+CLICONN(,r=127.0.0.11:1111<->l=127.0.0.1:8977){CONNECTING} connection established
+SRV(srv_link_test,127.0.0.11:1112) accept()ed new link from 127.0.0.1:8977
+CLICONN(,r=127.0.0.11:1112<->l=127.0.0.1:8977){CONNECTING} connection established
diff --git a/tests/stream/stream_test.ok b/tests/stream/stream_test.ok
index 2106295..14da5fa 100644
--- a/tests/stream/stream_test.ok
+++ b/tests/stream/stream_test.ok
@@ -48,4 +48,142 @@ Client/Server entering non-reconnecting event loop...
{11.000019} [OK] Client's read_cb_cli(): 0-byte read, auto-reconnect will be triggered if enabled
{20.000019} non-reconnecting test complete.
+______________________________________Running test test_segm_ipa_stream_srv______________________________________
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): [1-cli] Appending msg of type IPAC_MSGT_PING into buffer
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): (msg dump: 00 01 fe 00 )
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): [2-cli] Appending msg of type IPAC_MSGT_PONG into buffer
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): (msg dump: 00 01 fe 01 )
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): [3-cli] Appending msg of type IPAC_MSGT_PING into buffer
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): (msg dump: 00 01 fe 00 )
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): [4-cli] Appending msg of type IPAC_MSGT_ID_RESP into buffer
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): (msg dump: 00 07 fe 05 01 01 de ad be ef )
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): [(04 + 1/3)-cli] Appending 1st third of msg of type IPAC_MSGT_ID_GET into buffer
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): (dump: 00 03 )
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): Sending 4 + 1/3 messages as one:
+{20.000020} [NA] Client's test_segm_ipa_stream_srv_cli_connect_cb(): (msg dump: 00 01 fe 00 00 01 fe 01 00 01 fe 00 00 07 fe 05 01 01 de ad be ef 00 03 )
+
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): [1-srv] Received IPA message from stream (payload len = 1)
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): msg buff data (including stripped headers): 00 01 fe 00
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): IPA payload: 00
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Type: IPAC_MSGT_PING
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): (msg dump: 00 01 fe 00 )
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): [2-srv] Received IPA message from stream (payload len = 1)
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): msg buff data (including stripped headers): 00 01 fe 01
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): IPA payload: 01
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Type: IPAC_MSGT_PONG
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): (msg dump: 00 01 fe 01 )
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): [3-srv] Received IPA message from stream (payload len = 1)
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): msg buff data (including stripped headers): 00 01 fe 00
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): IPA payload: 00
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Type: IPAC_MSGT_PING
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): (msg dump: 00 01 fe 00 )
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): [4-srv] Received IPA message from stream (payload len = 7)
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): msg buff data (including stripped headers): 00 07 fe 05 01 01 de ad be ef
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): IPA payload: 05 01 01 de ad be ef
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Type: IPAC_MSGT_ID_RESP
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): (msg dump: 00 07 fe 05 01 01 de ad be ef )
+{20.000022} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Send IPAC_MSGT_ID_GET to trigger client to send next third
+
+{20.000024} [NA] Client's test_segm_ipa_stream_srv_cli_read_cb(): Received message from stream (payload len = 3)
+{20.000024} [NA] Client's test_segm_ipa_stream_srv_cli_read_cb(): Type: IPAC_MSGT_ID_GET
+{20.000024} [NA] Client's test_segm_ipa_stream_srv_cli_read_cb(): Got IPAC_MSGT_ID_GET from server
+{20.000024} [NA] Client's test_segm_ipa_stream_srv_cli_read_cb(): [(4 + 2/3) -cli] Appending: Second third of IPAC_MSGT_ID_GET
+{20.000024} [NA] Client's test_segm_ipa_stream_srv_cli_read_cb(): Sending: Second third of IPAC_MSGT_ID_GET
+{20.000024} [NA] Client's test_segm_ipa_stream_srv_cli_read_cb(): (msg dump: fe 04 )
+
+{20.500024} [NA] Client's send_last_third(): Delay for sending last third of message is over
+{20.500024} [NA] Client's send_last_third(): [5-cli] Appending: Last third of IPAC_MSGT_ID_GET
+{20.500024} [NA] Client's send_last_third(): [6-cli] Appending msg of type IPAC_MSGT_PONG into buffer
+{20.500024} [NA] Client's send_last_third(): (msg dump: 00 01 fe 01 )
+{20.500024} [NA] Client's send_last_third(): [7-cli] Appending msg of type IPAC_MSGT_PONG into buffer
+{20.500024} [NA] Client's send_last_third(): (msg dump: 00 01 fe 01 )
+{20.500024} [NA] Client's send_last_third(): Sending:[ Last third of IPAC_MSGT_ID_GET | IPAC_MSGT_PONG | IPAC_MSGT_PONG ]
+{20.500024} [NA] Client's send_last_third(): (msg dump: 01 01 00 01 fe 01 00 01 fe 01 )
+
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): [5-srv] Received IPA message from stream (payload len = 3)
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): msg buff data (including stripped headers): 00 03 fe 04 01 01
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): IPA payload: 04 01 01
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Type: IPAC_MSGT_ID_GET
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): (msg dump: 00 03 fe 04 01 01 )
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): [6-srv] Received IPA message from stream (payload len = 1)
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): msg buff data (including stripped headers): 00 01 fe 01
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): IPA payload: 01
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Type: IPAC_MSGT_PONG
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): (msg dump: 00 01 fe 01 )
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): [7-srv] Received IPA message from stream (payload len = 1)
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): msg buff data (including stripped headers): 00 01 fe 01
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): IPA payload: 01
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): Type: IPAC_MSGT_PONG
+{20.500026} [NA|OK] Server's test_segm_ipa_stream_srv_srv_read_cb(): (msg dump: 00 01 fe 01 )
+==================================Test test_segm_ipa_stream_srv complete========================================
+
+______________________________________Running test test_segm_ipa_stream_cli______________________________________
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): [1-srv] Appending msg of type IPAC_MSGT_PING into buffer
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): (msg dump: 00 01 fe 00 )
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): [2-srv] Appending msg of type IPAC_MSGT_PONG into buffer
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): (msg dump: 00 01 fe 01 )
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): [3-srv] Appending msg of type IPAC_MSGT_PING into buffer
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): (msg dump: 00 01 fe 00 )
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): [4-srv] Appending msg of type IPAC_MSGT_ID_RESP into buffer
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): (msg dump: 00 07 fe 05 01 01 de ad be ef )
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): [(04 + 1/3)-srv] Appending 1st third of msg of type IPAC_MSGT_ID_GET into buffer
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): (dump: 00 03 )
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): Sending 4 + 1/3 messages as one:
+{20.500027} [NA|OK] Server's test_segm_ipa_stream_cli_srv_accept_cb(): (msg dump: 00 01 fe 00 00 01 fe 01 00 01 fe 00 00 07 fe 05 01 01 de ad be ef 00 03 )
+
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): [1-cli] Received message from stream (len = 1)
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): msg buff data: 00
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): IPA payload: 00
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Type: IPAC_MSGT_PING
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): (msg dump (including stripped headers): 00 01 fe 00 )
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): [2-cli] Received message from stream (len = 1)
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): msg buff data: 01
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): IPA payload: 01
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Type: IPAC_MSGT_PONG
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): (msg dump (including stripped headers): 00 01 fe 01 )
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): [3-cli] Received message from stream (len = 1)
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): msg buff data: 00
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): IPA payload: 00
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Type: IPAC_MSGT_PING
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): (msg dump (including stripped headers): 00 01 fe 00 )
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): [4-cli] Received message from stream (len = 7)
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): msg buff data: 05 01 01 de ad be ef
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): IPA payload: 05 01 01 de ad be ef
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Type: IPAC_MSGT_ID_RESP
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): (msg dump (including stripped headers): 00 07 fe 05 01 01 de ad be ef )
+{20.500029} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Send IPAC_MSGT_ID_GET to trigger server to send next third
+
+{20.500031} [NA|OK] Server's test_segm_ipa_stream_cli_srv_read_cb(): Received message from stream (total len including stripped headers = 6)
+{20.500031} [NA|OK] Server's test_segm_ipa_stream_cli_srv_read_cb(): Type: IPAC_MSGT_ID_GET
+{20.500031} [NA|OK] Server's test_segm_ipa_stream_cli_srv_read_cb(): Got IPAC_MSGT_ID_GET from client
+{20.500031} [NA|OK] Server's test_segm_ipa_stream_cli_srv_read_cb(): [(4 + 2/3) -srv] Appending: Second third of IPAC_MSGT_ID_GET
+{20.500031} [NA|OK] Server's test_segm_ipa_stream_cli_srv_read_cb(): Sending: Second third of IPAC_MSGT_ID_GET
+{20.500031} [NA|OK] Server's test_segm_ipa_stream_cli_srv_read_cb(): (msg dump: fe 04 )
+
+{20.625031} [NA|OK] Server's send_last_third_srv(): Delay for sending last third of message is over
+{20.625031} [NA|OK] Server's send_last_third_srv(): [5-srv] Appending: Last third of IPAC_MSGT_ID_GET
+{20.625031} [NA|OK] Server's send_last_third_srv(): [6-srv] Appending msg of type IPAC_MSGT_PONG into buffer
+{20.625031} [NA|OK] Server's send_last_third_srv(): (msg dump: 00 01 fe 01 )
+{20.625031} [NA|OK] Server's send_last_third_srv(): [7-srv] Appending msg of type IPAC_MSGT_PONG into buffer
+{20.625031} [NA|OK] Server's send_last_third_srv(): (msg dump: 00 01 fe 01 )
+{20.625031} [NA|OK] Server's send_last_third_srv(): Sending:[ Last third of IPAC_MSGT_ID_GET | IPAC_MSGT_PONG | IPAC_MSGT_PONG ]
+{20.625031} [NA|OK] Server's send_last_third_srv(): (msg dump: 01 01 00 01 fe 01 00 01 fe 01 )
+
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): [5-cli] Received message from stream (len = 3)
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): msg buff data: 04 01 01
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): IPA payload: 04 01 01
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Type: IPAC_MSGT_ID_GET
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): (msg dump (including stripped headers): 00 03 fe 04 01 01 )
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): [6-cli] Received message from stream (len = 1)
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): msg buff data: 01
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): IPA payload: 01
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Type: IPAC_MSGT_PONG
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): (msg dump (including stripped headers): 00 01 fe 01 )
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): [7-cli] Received message from stream (len = 1)
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): msg buff data: 01
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): IPA payload: 01
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): Type: IPAC_MSGT_PONG
+{20.625033} [NA] Client's test_segm_ipa_stream_cli_cli_read_cb(): (msg dump (including stripped headers): 00 01 fe 01 )
+==================================Test test_segm_ipa_stream_cli complete========================================
+
Stream tests completed
diff --git a/tests/testsuite.at b/tests/testsuite.at
index 0cf108f..b84c4ee 100644
--- a/tests/testsuite.at
+++ b/tests/testsuite.at
@@ -14,10 +14,16 @@ cat $abs_srcdir/osmux/osmux_test.ok > expout
AT_CHECK([$abs_top_builddir/tests/osmux/osmux_test 2>&1], [0], [expout], [ignore])
AT_CLEANUP
-AT_SETUP([osmux_test2])
-AT_KEYWORDS([osmux_test2])
-cat $abs_srcdir/osmux/osmux_test2.ok > expout
-AT_CHECK([$abs_top_builddir/tests/osmux/osmux_test2], [0], [expout], [ignore])
+AT_SETUP([osmux_output_test])
+AT_KEYWORDS([osmux_output_test])
+cat $abs_srcdir/osmux/osmux_output_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/osmux/osmux_output_test], [0], [expout], [ignore])
+AT_CLEANUP
+
+AT_SETUP([osmux_input_test])
+AT_KEYWORDS([osmux_input_test])
+cat $abs_srcdir/osmux/osmux_input_test.ok > expout
+AT_CHECK([$abs_top_builddir/tests/osmux/osmux_input_test], [0], [expout], [ignore])
AT_CLEANUP
AT_SETUP([jibuf_test])
diff --git a/utils/Makefile.am b/utils/Makefile.am
new file mode 100644
index 0000000..0df792b
--- /dev/null
+++ b/utils/Makefile.am
@@ -0,0 +1,19 @@
+AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include
+AM_CFLAGS = \
+ -Wall \
+ $(LIBOSMOCORE_CFLAGS) \
+ $(LIBOSMOCODEC_CFLAGS) \
+ $(LIBOSMOGSM_CFLAGS) \
+ $(TALLOC_CFLAGS) \
+ $(NULL)
+
+LDADD = \
+ $(top_builddir)/src/libosmonetif.la \
+ $(LIBOSMOCORE_LIBS) \
+ $(LIBOSMOCODEC_LIBS) \
+ $(LIBOSMOGSM_LIBS) \
+ $(NULL)
+
+noinst_PROGRAMS = osmo-amr-inspect
+
+osmo_amr_inspect_SOURCES = osmo-amr-inspect.c
diff --git a/utils/osmo-amr-inspect.c b/utils/osmo-amr-inspect.c
new file mode 100644
index 0000000..dbf612d
--- /dev/null
+++ b/utils/osmo-amr-inspect.c
@@ -0,0 +1,325 @@
+/*! \file osmo-amr-inspect.c
+ * Utility program to inspect AMR payloads */
+/*
+ * (C) 2022 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+ * Author: Pau espin Pedrol <pespin@sysmocom.de>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <stdio.h>
+#include <getopt.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <strings.h>
+
+#include <osmocom/core/utils.h>
+#include <osmocom/core/logging.h>
+#include <osmocom/codec/codec.h>
+#include <osmocom/netif/amr.h>
+
+enum force_amr_input_fmt {
+ FORCE_AMR_INPUT_FMT_AUTO = 0,
+ FORCE_AMR_INPUT_FMT_OA,
+ FORCE_AMR_INPUT_FMT_BWE,
+ FORCE_AMR_INPUT_FMT_ALL,
+};
+
+static enum force_amr_input_fmt force_fmt = FORCE_AMR_INPUT_FMT_AUTO;
+static bool use_color = false;
+
+static void help(const char *progname)
+{
+ printf("Usage: %s [-h] [-i filename] [-F (auto|oa|bwe|all)] [-C]\n",
+ progname);
+}
+
+#define println_color(color, fmt, args ...) \
+ do { \
+ if (use_color) \
+ printf(color fmt OSMO_LOGCOLOR_END "\n", ## args); \
+ else \
+ printf(fmt "\n", ## args); \
+ } while (0)
+
+#define println_red(fmt, args ...) \
+ println_color(OSMO_LOGCOLOR_RED, fmt OSMO_LOGCOLOR_END, ## args)
+
+#define println_orange(fmt, args ...) \
+ println_color(OSMO_LOGCOLOR_YELLOW, fmt OSMO_LOGCOLOR_END, ## args)
+
+static void inspect_amr_oa(const uint8_t *buf, size_t buf_len)
+{
+ const struct amr_hdr *hdr = (const struct amr_hdr *)buf;
+ size_t payload_len = buf_len - sizeof(*hdr);
+ const uint8_t *payload = hdr->data;
+ size_t ft_bytes, ft_bits;
+ printf(" octet-aligned\n");
+ printf(" CMR: %u\n", hdr->cmr);
+ printf(" F: %u\n", hdr->f);
+ printf(" FT: %u (%s)\n", hdr->ft, osmo_amr_type_name(hdr->ft));
+ printf(" Q: %u\n", hdr->q);
+ printf(" Payload (%lu bytes): %s\n",
+ buf_len - sizeof(*hdr), osmo_hexdump_nospc(payload, payload_len));
+
+ if (hdr->f)
+ println_orange(" WARN: F=%u not supported!", hdr->f);
+ if (!osmo_amr_ft_valid(hdr->cmr))
+ println_red(" ERROR: CMR=%u not valid!", hdr->cmr);
+ if (!osmo_amr_ft_valid(hdr->ft))
+ println_red(" ERROR: FT=%u not valid!", hdr->ft);
+ if (hdr->pad1 != 0)
+ println_orange(" WARN: PAD1=0x%x not zero!", hdr->pad1);
+ if (hdr->pad2 != 0)
+ println_orange(" WARN: PAD2=0x%x not zero!", hdr->pad2);
+ ft_bytes = osmo_amr_bytes(hdr->ft);
+ if (payload_len != ft_bytes) {
+ println_red(" ERROR: Wrong payload byte-length %lu != exp %lu!", payload_len, ft_bytes);
+ } else {
+ ft_bits = osmo_amr_bits(hdr->ft);
+ if (ft_bits/8 == ft_bytes) {
+ printf(" Payload has no padding (%lu bits)\n", ft_bits);
+ } else {
+ uint8_t last_byte = payload[payload_len - 1];
+ uint8_t padding = last_byte & (0xff >> (ft_bits & 3));
+ if (padding)
+ println_orange(" WARN: Payload last byte = 0x%02x has PAD=0x%02x not zero!", last_byte, padding);
+ }
+ }
+}
+
+static void inspect_amr_bwe(const uint8_t *buf, size_t buf_len)
+{
+ const struct amr_hdr_bwe *hdr = (const struct amr_hdr_bwe *)buf;
+ size_t payload_len_bits = 6 + (buf_len - sizeof(*hdr))*8;
+ size_t ft_bits;
+ int rc;
+ uint8_t buf_oa[buf_len + 1];
+ uint8_t ft = (hdr->ft_hi << 1) | hdr->ft_lo;
+
+ printf(" bandwith-efficient\n");
+ printf(" CMR: %u\n", hdr->cmr);
+ printf(" F: %u\n", hdr->f);
+ printf(" FT: %u (%s)\n", ft, osmo_amr_type_name(ft));
+ printf(" Q: %u\n", hdr->q);
+ printf(" Payload first 6 bits: 0x%02x\n", hdr->data_start);
+ printf(" Payload continuation (%lu bytes): %s\n", buf_len - sizeof(*hdr),
+ osmo_hexdump_nospc(buf + sizeof(*hdr), buf_len - sizeof(*hdr)));
+
+ if (hdr->f)
+ println_orange(" WARN: F=%u not supported!", hdr->f);
+ if (!osmo_amr_ft_valid(hdr->cmr))
+ println_red(" ERROR: CMR=%u not valid!", hdr->cmr);
+ if (!osmo_amr_ft_valid(ft)) {
+ println_red(" ERROR: FT=%u not valid!", ft);
+ return;
+ }
+ ft_bits = osmo_amr_bits(ft);
+ if (ft_bits != payload_len_bits) {
+ println_red(" ERROR: Wrong payload bits-length %lu != exp %lu! (FT=%u)\n", payload_len_bits, ft_bits, ft);
+ return;
+ }
+
+ if (!((AMR_HDR_BWE_LEN_BITS + ft_bits) & 0x03)) {
+ printf(" Payload has no padding (%lu bits with offset 10)\n", ft_bits);
+ } else {
+ uint8_t last_byte = buf[buf_len - 1];
+ uint8_t padding = last_byte & (0xff >> ((AMR_HDR_BWE_LEN_BITS + ft_bits) & 0x03));
+ if (padding)
+ println_orange(" WARN: Payload last byte = 0x%02x has PAD=0x%02x not zero!", last_byte, padding);
+ }
+
+ memcpy(buf_oa, buf, buf_len);
+ rc = osmo_amr_bwe_to_oa(buf_oa, buf_len, sizeof(buf_oa));
+ if (rc < 0) {
+ println_red(" ERROR: Unable to convert to octet-aligned!");
+ return;
+ }
+ printf(" Payload (octet-aligned %d bytes): %s", rc,
+ osmo_hexdump_nospc(buf_oa + sizeof(struct amr_hdr), rc));
+}
+
+static void inspect_amr(unsigned int i, const uint8_t *buf, size_t buf_len)
+{
+ bool is_oa;
+ printf("[%u] Buffer (%lu bytes): %s\n", i, buf_len, osmo_hexdump_nospc(buf, buf_len));
+ is_oa = osmo_amr_is_oa(buf, buf_len);
+ switch (force_fmt) {
+ case FORCE_AMR_INPUT_FMT_AUTO:
+ if (is_oa)
+ inspect_amr_oa(buf, buf_len);
+ else
+ inspect_amr_bwe(buf, buf_len);
+ break;
+ case FORCE_AMR_INPUT_FMT_OA:
+ if (!is_oa)
+ println_orange(" WARN: detected as 'bwe' but forced as 'oa'");
+ inspect_amr_oa(buf, buf_len);
+ break;
+ case FORCE_AMR_INPUT_FMT_BWE:
+ if (is_oa)
+ println_orange(" WARN: detected as 'oa' but forced as 'bwe'");
+ inspect_amr_bwe(buf, buf_len);
+ break;
+ case FORCE_AMR_INPUT_FMT_ALL:
+ if (!is_oa)
+ println_orange(" WARN: detected as 'bwe' but forced as 'oa'");
+ inspect_amr_oa(buf, buf_len);
+ if (is_oa)
+ println_orange(" WARN: detected as 'oa' but forced as 'bwe'");
+ inspect_amr_bwe(buf, buf_len);
+ break;
+ default:
+ OSMO_ASSERT(0);
+ }
+ printf("\n");
+}
+
+static int read_file(const char *filename)
+{
+ FILE *fp;
+ char *line = NULL;
+ size_t len = 0;
+ ssize_t read;
+ uint8_t buf[4096];
+ int rc = 0;
+ unsigned int i = 0;
+
+ fp = fopen(filename, "r");
+ if (fp == NULL) {
+ fprintf(stderr, "Failed opening %s: %s\n", filename, strerror(errno));
+ return -errno;
+ }
+
+ while ((read = getline(&line, &len, fp)) != -1) {
+ if (len & 1) {
+ fprintf(stderr, "Failed parsing (wrong even length): %s\n", line);
+ rc = -1;
+ goto free_ret;
+ }
+ if (len > sizeof(buf)*2) {
+ fprintf(stderr, "Failed parsing (too big): %s\n", line);
+ rc = -1;
+ goto free_ret;
+ }
+ rc = osmo_hexparse(line, buf, sizeof(buf));
+ if (rc < 0) {
+ fprintf(stderr, "Failed parsing (hexparse error): %s\n", line);
+ rc = -1;
+ goto free_ret;
+ }
+ if (rc < 2) {
+ fprintf(stderr, "Too short to be an AMR buffer (%u bytes): %s\n", rc, line);
+ rc = -1;
+ goto free_ret;
+ }
+ inspect_amr(i, buf, rc);
+ i++;
+ }
+
+free_ret:
+ fclose(fp);
+ if (line)
+ free(line);
+ return rc;
+}
+
+static int read_stdin(void)
+{
+ ssize_t rc;
+ size_t hex_buflen;
+ char hex_buf[4096];
+ uint8_t buf[2048];
+ rc = read(0, hex_buf, sizeof(hex_buf) - 1);
+ if (rc < 0) {
+ fprintf(stderr, "Failed reading stdin: %s\n", strerror(errno));
+ return -EIO;
+ }
+ hex_buflen = rc;
+ hex_buf[hex_buflen] = '\0';
+
+ if (hex_buflen == sizeof(hex_buf) - 1) {
+ fprintf(stderr, "Failed parsing (input too long > %lu): %s\n", hex_buflen, hex_buf);
+ return -ENOMEM;
+ }
+
+ rc = osmo_hexparse(hex_buf, buf, sizeof(buf));
+ if (rc < 0) {
+ fprintf(stderr, "Failed parsing (hexparse error): %s\n", hex_buf);
+ return -1;
+ }
+ if (rc < 2) {
+ fprintf(stderr, "Too short to be an AMR buffer (%ld bytes): %s\n", rc, hex_buf);
+ return -1;
+ }
+
+ inspect_amr(0, buf, rc);
+ return 0;
+}
+
+int main(int argc, char **argv)
+{
+ int opt;
+ char *filename = NULL;
+ int rc;
+
+ while ((opt = getopt(argc, argv, "i:F:Ch")) != -1) {
+ switch (opt) {
+ case 'i':
+ filename = optarg;
+ break;
+ case 'F':
+ if (strcasecmp(optarg, "auto") == 0) {
+ force_fmt = FORCE_AMR_INPUT_FMT_AUTO;
+ } else if (strcasecmp(optarg, "oa") == 0) {
+ force_fmt = FORCE_AMR_INPUT_FMT_OA;
+ } else if (strcasecmp(optarg, "bwe") == 0) {
+ force_fmt = FORCE_AMR_INPUT_FMT_BWE;
+ } else if (strcasecmp(optarg, "all") == 0) {
+ force_fmt = FORCE_AMR_INPUT_FMT_ALL;
+ } else {
+ help(argv[0]);
+ exit(1);
+ }
+ break;
+ case 'h':
+ help(argv[0]);
+ exit(0);
+ break;
+ case 'C':
+ use_color = true;
+ break;
+ default:
+ break;
+ }
+ }
+
+ if (argc > optind) {
+ fprintf(stderr, "Unsupported positional arguments in command line\n");
+ exit(2);
+ }
+
+ if (filename) {
+ rc = read_file(filename);
+ exit(-rc);
+ } else {
+ rc = read_stdin();
+ exit(-rc);
+ }
+
+ exit(0);
+}