Commit Graph

53 Commits

Author SHA1 Message Date
Pau Espin 22b4e8159d osmux: Introduce API osmux_xfrm_input_set_name()
This will be used internally by osmux code to print more meaningful
lines.

Related: SYS#6161
Change-Id: Ibbcfdb23a6015ce45840bb64b2b560c2806f7ff6
2022-11-18 17:37:46 +01:00
Pau Espin c798429cb0 osmux: Support recreating lost RTP packets at start of the batch
Previously, if RTP jumps were detected in the incoming RTP stream and
osmux state for that circuit was to start the next batch, the hole would
not been filled during queueing time and instead the encoder would have
set the M bit in the osmuxhdr to announce a sync point.
For small holes (eg less than the batch factor) it makes sense to start
filling the batch with crafted RTP packets in order to avoid the encoder
later on setting the M bit and hence avoid the peer receiving the Osmux
frame having to start a new syncrhonization point.

Related: SYS#6161
Change-Id: I9596501adf5b7b91983618c92c7b1792ee9461a3
2022-11-18 16:46:00 +01:00
Pau Espin b8ef4a0853 osmux: Set M bit in osmuxhdr if seqnum hole found encoding RTP pkts
So far only small intra-batch seqnum jumps are filled in with forged RTP
packets when storing the incoming RTP packets.
Under some conditions, holes may still exist in the queue of RTP packets
for a stream:
* Seqnum detected when first incoming RTP in batch is queued (this can
  be improved in the future).
* Big seqnum jumps > batch_factor or simply filling out of bounds for currently
  enqueued batch.

Specially the second case can come from long network dropouts, or simply
due to a bug in the RTP being feed to osmux layer (be it from local code
or peer). In that case (long jumps) we don't want to generate tons of
packets filling in several entire batches (potentially incredibly big
amount of batches).
Instead, in these scenarios, simply let the osmux peer know there was a
jump by setting the M bit on the next osmux header for that circuit
after the seq jump has been detected.

Related: SYS#6161
Change-Id: I05b1eae400cb60d1f4e927f853619d5ff470163f
2022-11-16 19:54:16 +01:00
Pau Espin e6306faebd osmux: Use better rationale when limiting amount of lost & forged RTP incoming packets
Related: SYS#6161
Change-Id: I4ea700dbbf469498befc939a844324259bbe332a
2022-11-16 19:53:28 +01:00
Pau Espin 348229a37c osmux: Obey current batch_size restrictions when creating forged RTP packets to fill holes
osmux_link_add() is renamed to osmux_link_handle_rtp_req(), and the last
part of it is split out and kept as osmux_link_add().
hence osmux_link_handle_rtp_req() does proper input checking (like
duplicates, holes, etc.) while osmux_link_add() expects all that to be
sorted out.
Reuse osmux_link_add() in osmux_replay_lost_packets() to properly update
the link state of the to-be-transmitted packet, circuit state, etc.

Change-Id: I4ea435bfb2490a375ad3e5068ee926e48b53cf5c
2022-11-16 19:49:42 +01:00
Pau Espin 95bd0ecd82 tests/osmux: Test big seqnum holes (>batch_factor) in incoming RTP stream
This test shows that there's 2 bugs in the osmux_input code:
* It should be transmitting 2 osmux frames instead of 1
* Once it is fixed to transmitt 2 osmux frames, it should set the M bit of the 2nd
generated osmux header after the seqnum jump in order to announce a jump in the
stream to the peer receiving osmux.

The bugs are fixed in follow-up patches.

Related: SYS#6161
Change-Id: I521c2e97a739e8a824b16f06ec2a578333388247
2022-11-16 19:46:30 +01:00
Pau Espin a9c1c5d61c tests/osmux: Test incoming RTP stream with seqnum jumps during wraparound
Related: SYS#6161
Change-Id: Idd3a609452767f9c480c7c5ba9fc2a3e0a499968
2022-11-16 18:00:54 +01:00
Pau Espin ecb6de4117 tests/osmux: Test replay of one lost RTP packet when generating osmux batches
Change-Id: I913c2ccfc3ad4e7ed801344d64e33e166a0817cf
2022-11-16 18:00:08 +01:00
Pau Espin 7c4d953b6d osmux: dup in RTP pkt: Replace potentially internally forged pkt with incoming one
When RTP packet provided by user to osmux layer, it may contain a seq
gap, and osmux will refill the packets to avoid losing that information
on the other side when it receives the batch.
If out of order UDP packets are received, it can happen that we first
detect a gap and later on we receive the previous RTP packet, which we
is then detected as duplicate because it was previously forged to fill
the hole. In that case, let's better keep the incoming packet instead of
the potentially internall forged one which doesn't contain the real AMR
payload.

Related: SYS#6161
Change-Id: I82e11ef3dcd20ffea33c94ed83abcedf0f186871
2022-11-15 19:55:03 +01:00
Pau Espin 17fca03cf8 osmux: Rework log formatting when replaying detected RTP gaps
The existing code has several flaws which will be fixed in follow-up
patches.

Related: SYS#6161
Change-Id: I5fd64acf7bc1e53efae0674d0c906d1255a9bbf6
2022-11-14 17:53:16 +01:00
Pau Espin 6fe1f35001 osmux: Replace deprecated osmux_xfrm_input_* APIs in examples & tests
Change-Id: I7f3f8d40f89ffdd135a73316ee60fd429ba2a5b0
2022-10-03 11:30:45 +02:00
Pau Espin b0369f375f osmux: Take into account configured osmux_in_handle->osmux_seq field
It was not being used anywhere, yet older applications used to set it
(always to 0, which was the default value applied internally).
Let's make use of it and apply it as first seqnum to be used on a
circuit.
This value is applied upon call to osmux_xfrm_input_open_circuit(),
hence it can be set independently for every new circuit.

Change-Id: Ia26fcba5d7364a5744b2d64d0542a2b3880eee34
2022-10-03 09:29:18 +00:00
Pau Espin de68bc9065 osmux: Fix unwanted RTP marker bit upon rx of osmux seqnum wrap around
The wrap around case was not properly considered in the condition
setting the Marker bit. Let's fix it.

Related: SYS#5987
Change-Id: I6e01f29a6239f930c9be2bcb2efe447e5de8fedf
2022-09-29 11:49:47 +02:00
Pau Espin dc4e8747e9 tests/osmux: Test rx of osmux seqnum wrap around
This test shows that there's a bug where the first RTP packet extracted
from the received osmux batch with seqnum=0 has the M bit marked for no
good reason.

Related: SYS#5987
Change-Id: Ida658c681e84878f209ab4965d8aa821a570a580
2022-09-29 11:49:47 +02:00
Pau Espin e486efa264 tests/osmux: Properly flush and free out_handle in osmux_test
Change-Id: Ia86e4324e21ccc4bd4b138fa5b2b748df23b0aed
2022-09-29 11:49:43 +02:00
Pau Espin d2810679c7 osmux: Fix osmux seqnum incremented globally instead of per circuit
There's no real use in having a global seqnum. The seqnum, as specified
by the osmux protocol specification, relates to that of the RTP
seq+timestamp, hence it is per circuit.
Having it per circuit allows detecting gaps and lost batches on the
receiver side, applying the Marker bit on the re-assembled RTP packets.

As a resut of the fix, tests/osmux/osmux_test part validating Marker bit
started failing. It failed because it was wrongly written to start with,
since it used only one osmux_out_handle for the 4 CIDs in use, which was
wrong, since each CID must have its own osmux_out_handle as state is
kept there per circuit.

Related: SYS#5987
Change-Id: I562de6a871d8a35475c314ca107c2a12b55d6683
2022-09-29 11:48:39 +02:00
Pau Espin 77f989504b osmux: Fix AMR F,Q,CMR fields not properly encoded in osmux header
The value of the first RTP packet in the batch was being encoded,
instead of the last one (as documented in the Osmux protocol
specification).

Related: SYS#5987
Change-Id: I06f3d07a05181d938c22bbd0da7172b5dad6659a
2022-09-28 19:13:54 +02:00
Pau Espin b6f4fa2334 tests/osmux: Add new osmux_input_test to validate AMR FT changes
Related: SYS#5987
Change-Id: I105466fc8a4d92341f34886ee81ef0ca04014514
2022-09-28 19:12:39 +02:00
Pau Espin 2640c157f8 osmux: Print osmux_hdr rtp_m field in osmux_snprintf()
Change-Id: Idfe530b944ac5dfd5ce6b5150421c2d4daee8788
2022-09-28 19:03:52 +02:00
Pau Espin bc68849a68 tests: rename test osmux_test2 -> osmux_output_test
That file focuses on testing the osmux_output_* API, ie receiving Osmux
frames and decoding it into batches and later on into rtp packets.

Change-Id: I7e6eda1e2e676673771bc6a7c3682d07ac1d344e
2022-09-28 19:03:52 +02:00
Pau Espin fffbfaa6f8 tests/osmux: Always run with fake time
Let's not make the tests more difficult to maintain and extend by
allowing them to run in real clock time, there's no real need for it.

Change-Id: I549a4722d63d700b54b146260131a68e656b843e
2022-09-28 19:03:52 +02:00
Pau Espin 038d957b7d tests/osmux_test2: Document unit tests
Change-Id: I56f27af52b6a8d798879c70d68a9a3b9e512867d
2022-09-28 19:03:49 +02:00
Pau Espin 3b0991e80f osmux: Allocate struct osmux_out_handle through API
Until now, the osmux_out_handle was allocated by the client, and passed
to the API to initialize it. This makes it really hard to improve the
implementation without breaking the ABI.

Let's break the ABI now one last time (hopefully) by allocating the
struct through an API. With only this change, the already built users
(osmo-mgw, openbsc) can still work fine, since there's no change on the
struct osmux_out_handle. However, they will somehow break next time the
struct is changed until they are ported to the same API (easy to do).

Related: OS#5987
Change-Id: Ie8df581f375c9a183a7af60b431561bda82f6e34
2022-09-02 11:29:05 +02:00
Pau Espin 3e659ce22d tests: Replace deprecated API log_set_print_filename
Change-Id: Id44722fa42fc94af7d55b8b984657a8535e66a9f
2021-02-19 13:08:50 +01:00
Neels Hofmeyr 6413a6b53f osmux_test: don't use color logging
Change-Id: I7b0c8d311123f4fa0aeedf3938c8628a4442daf7
2019-11-20 05:03:37 +01:00
Pau Espin 366f0dbf81 tests: osmux_test: Hardcode h_output values set by random()
osmux implementation randomizes those values. It seems build in OBS
sometimes provide different values than the ones expected in the test
result. Let's hardcode them to make sure we always have the same values
regarless of the random() implementation.

Values chosen are the one matching the current expected test output so
it doesn't need any change.

Change-Id: Icc553c83ddff41900ae3d5990a655c29c9073e01
2019-10-18 09:27:50 +00:00
Pau Espin 77ba4e61cb tests: osmux_test: Provide More accurate logging expectancies
Change-Id: I85722ebcb5486426dfe76cdca1b8a0692bb5b111
2019-10-04 18:39:47 +02:00
Pau Espin 71abacdda0 tests: osmux_test: Use fake time also for monotonic clock
Currently osmux related code uses both gettimeofday on some parts and
clock_gettime(CLOCK_MONOTONIC) on others (for different purposes).

Let's fake both clocks and not only the one used by gettimeofday API.

Change-Id: I4e1a0eb4f8c4ea1bc0f963afa18b116d3af9978c
2019-10-04 12:43:43 +02:00
Pau Espin f0f1ebf70e osmux: Extend osmux_out_handle and add new API to set rtp payload_type
Previously payload_type was always hardcoded to 98 for generated rtp
packets from incoming osmux frame.

Change-Id: I5cbeb494a8932953d9fd2dc24dacf8cd97fd84e4
2019-05-17 17:12:56 +02:00
Pau Espin df0ad6c1a4 osmux: Move examples and tests to use new output APIs
Change-Id: Ie69c427308eb7d81aedab7fbb71f1bdaf43f0275
2018-04-19 18:24:25 +02:00
Pau Espin e259c8ab18 osmux: Set Marker bit on osmux frame loss detected
Until this patch, we didn't notify in any way to the RTP reader when an
Osmux frame was lost. Instead, we updated the seq&timestamp as if there
was no lost, and as a result the RTP reader would only see a steady
increase of delay every time an osmux frame was lost.

As the batch_factor for the lost packet is unknown, we cannot assume any
number of amr payloads lost, and thus we cannot simply increment seq and
timestamp for a specific amount. Instead, the only viable solution seems
to set the M marker bit in the first rtp packet generated after a
non-consecutive osmux frame is received.

The implementation may act differently with the first generated RTP
packet based on the first osmux seq number used for the stream. In case
0 it's used as first osmux seq number, M will be set depending on
request from original RTP packet having the M bit set. If it's not 0,
the first RTP packer will unconditionally have the M bit. That's not an
issue because it's anyway expect for receiver to sync on the first
packet.

Related: OS#3185

Change-Id: I2efed6d726a1b8e77e686c7a5fe1940d3f4901a7
2018-04-19 18:24:25 +02:00
Pau Espin 9452adcc33 tests: Add osmux2 testsuite
This test is aimed at testing several specific scenarios related to how
osmux manages in/out of osmux/rtp packets over time.

Change-Id: I3bf59276424ea87c4e66a6ff46de1e3e9a06a904
2018-04-19 18:24:25 +02:00
Pau Espin d5b68e2c70 tests: use osmo_init_logging2
Change-Id: Icc84bbd53e1589e26e445e3460024e77162bd76f
2018-04-17 11:41:13 +02:00
Pablo Neira Ayuso 14af167a55 osmux: fix buffer management mess in snprintf() calls
SNPRINTF_BUFFER_SIZE() looks too complex, previous version maintains two
different variables to account for the remaining space in the buffer,
one of them is always decremented based on what snprintf() returns,
which may result in underflow. These variables are swapped - not used
consistently - all over this code.

Replace this macro by a simplified version, with one single parameter to
account for remaining space. This macro also deals with two corner
cases:

1) snprintf() fails, actually never happens in practise, but
   documentation indicates it may return -1, so let's catch this case
   from here to stick to specs.

2) There is not enough space in the buffer, in that case, keep
   increasing offset, so we know how much would have been printed, just
   like snprintf() does.

Thanks to Pau Espin for reporting, and Holger for clues on this.
I have run osmux_test and, at quick glance, it looks good.

Change-Id: I5b5d6ec57a02f57c23b1ae86dbd894bad28ea797
2017-09-11 18:06:37 +00:00
Pau Espin e786055567 osmux: Slightly improve output format of osmux_snprintf
The buffer for osmux_test is increased as the former doesn't seem to be
able to cope with the whole output.

Change-Id: Ic838dd9d7ad89b4510ccfa58c0390c69a075b616
2017-08-14 17:24:11 +02:00
Pau Espin 3460ad7f31 osmux: Use osmo_gettimeofday for testing puroposes
This way we can use fake time and osmux_test take 700ms instead of
>2sec to run.

Change-Id: Ic39cab74400aca8262a00c0d06884230b1a15ca3
2017-04-27 08:50:01 +00:00
Pau Espin e98afe5808 osmux: Add RTP marker bit support
According to RFC4867 (RTP payload format for AMR):
"The RTP header marker bit (M) SHALL be set to 1 if the first frameblock
carried in the packet contains a speech frame which is the first in a
talkspurt.  For all other packets the marker bit SHALL be set to zero (M=0)."

This information bit provides a way for the receiver to better
synchronize the delay with ther sender.

This is specially useful if AMR DTX features are supported and
enabled on the sender.

Change-Id: I0315658159429603f1d80a168718b026015060e9
2017-04-27 08:50:01 +00:00
Neels Hofmeyr f468e720ad osmux-test: remove real-time constraint by default
Introduce a local #define to disable the real-time constraint from osmux-test.
It would make sense to remove this completely, but in case anyone may be
interested in the timing on a specific platform, I've just #defined it away.

The real-time constraint to pass or fail the test is a bad idea in terms of our
build server. Whenever the server is loaded, the tests will fail for no reason,
like here: https://gerrit.osmocom.org/474
The real time to calculate is highly dependent also on the hardware platform.
The arbitrarity of the time constraint is sort of proven by dd24cdd95f
which simply doubles the time to pass the test.

Change-Id: Ic1da4bd22411652334f73195b2e37853e0738906
2016-07-07 14:13:16 +02:00
Neels Hofmeyr e03b3bc757 osmux_test.c: tweak error report 2016-02-29 15:49:10 +01:00
Pablo Neira Ayuso 552bae6081 tests: osmux: iterate 64 times in osmo_test_loop()
Instead of 63, this resolves major "definitely lost" remaining leak that
valgrind reports regarding msgb.
2015-07-21 12:04:58 +02:00
Pablo Neira Ayuso 41d5c3081a tests: osmux: fix msgb leaks 2015-07-21 11:05:41 +02:00
Pablo Neira Ayuso f9407cc668 tests: osmux: test circuit reopening after closure
Make sure circuit routines works correctly.
2015-07-21 11:05:41 +02:00
Pablo Neira Ayuso b8bdc290d0 tests: osmux: validate dummy padding with no voice data interaction
Make sure that early dummy bandwitch preallocation works fine in the absence of
any kind of voice traffic.
2015-07-21 11:05:40 +02:00
Pablo Neira Ayuso 386e7755a7 tests: osmux: test online deactivation of dummy padding
Add RTP packets to circuit with dummy padding enabled to test automatic
deactivation once when start seeing real voice traffic.
2015-07-21 11:05:34 +02:00
Pablo Neira Ayuso b36951e6e3 tests: osmux: factor out main test loop
Move main test loop routine to the new osmux_test_loop() function.
2015-07-21 11:02:30 +02:00
Pablo Neira Ayuso 635bef7363 tests: osmux: adapt it to use the new circuit API
This also introduces a spare circuit that contains no voice data to test
bandwidth preallocation through the new osmux dummy frame type.
2015-07-21 10:24:23 +02:00
Holger Hans Peter Freyther 153f585660 misc: Fix distcheck and refer to the right file 2014-05-22 17:25:57 +02:00
Pablo Neira Ayuso fe9823b6d5 tests: osmux: no need to skip RTP message anymore
With the fan-out approach to test multi-batch added int (078d532 tests:
osmux: test multi-batch support), this doesn't need the explicit
skip as there are already gaps to be filled.
2013-12-16 12:55:26 +01:00
Pablo Neira Ayuso 078d532930 tests: osmux: test multi-batch support
Extend this to test multi-batch in one packet support, eg.

OSMUX message (len=158) OSMUX seq=016 ccid=000 ft=1 ctr=6 amr_f=0 amr_q=1
amr_ft=02 amr_cmr=02 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff
fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54
ff d4 f9 ff fb e7 eb f9 9f f8 f2 26 33 65 54 ff d4 f9 ff fb e7 eb f9 9f f8 f2
26 33 65 54 ff d4 f9 ff fb e7 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 ]
2013-12-16 10:43:20 +01:00
Pablo Neira Ayuso dd24cdd95f tests: osmux-test: double timing validation threshold
Double timing validation to avoid hitting errors easily.
2013-05-27 11:19:35 +02:00