Commit Graph

331 Commits

Author SHA1 Message Date
Pau Espin 3e6f4d12c9 stream: Document osmo_stream_srv_recv() SCTP specialties
Change-Id: I47b066f26e63afd4bdb135f822667d1cd9479920
2022-09-30 17:57:56 +02:00
Pau Espin 96271688cf stream: Return 0 when receiving sctp notification SCTP_COMM_LOST
It was seen on a real pcap trace (sctp & gsmtap_log) that the Linux
kernel stack may decide to kill the connection (sending an ABORT) if
it fails to transmit some data after a while:
ABORT Cause code: "Protocol violation (0x000d)",
      Cause Information: "Association exceeded its max_retrans count".
When this occurs, the kernel sends the
MSG_NOTIFICATION,SCTP_ASSOC_CHANGE,SCTP_COMM_LOST notification when
reading from the socket with sctp_recvmsg(). This basically signals that
the socket conn is dead, and subsequent writes to it will result in
send() failures (and receive SCTP_SEND_FAILED notification upon follow
up reads).
It's important to notice that after those events, there's no other sort
of different event like SHUTDOWN coming in, so that's the time at which
we must tell the user to close the socket.
Hence, let's signal the caller that the socket is dead by returning 0,
to comply with usual recv() API.

Related: SYS#6113
Change-Id: If94d44f25b76a96a5ea402fec9fc14c4e6296ba3
2022-09-30 17:57:40 +02:00
Pau Espin 04572b2f6a stream: Remove unneeded break statement
Change-Id: Iaa36a3661fc3d049f656342ee6dc3aafd45498bb
2022-09-30 14:24:12 +02:00
Pau Espin 8dd1e15661 stream: Set sctp_ppid and sctp_stream when sctp notifciation is received
Let's set these values in all cases.

Change-Id: I99f6098d8d9fc1c06bc28373bf7ee76f15d5f525
2022-09-30 14:22:15 +02:00
Pau Espin 36a9f3eae8 stream: Log rx of sctp notification SCTP_SEND_FAILED
Change-Id: I16d3ed950d4da3b13cca25bcd8f29af0d880c23e
2022-09-30 14:21:22 +02:00
Pau Espin 5dd81f3c63 stream: Erase sctp_msg_flags if receiving user data
It could be that the user reuses the msgb passed to
osmo_stream_srv_recv() all the time, hence we need to reset the flags,
otherwise it may end up being set forever.

Change-Id: Id358140db82b018e3973111e530834589c0b7224
2022-09-30 14:09:34 +02:00
Pau Espin 56f20d4192 stream: Set proper msgb length when returning sctp_notification
This allows the user to properly check the size of the content in case
the struct ABI changes.
-EAGAIN is still returned to avoid older users of the API reading SCTP
notifications as user data.

Change-Id: I95e2457498fd8e0d790d221cb97695ace0dd673e
2022-09-30 14:07:03 +02: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 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 9aa01ae7b5 cosmetic: osmux: Fix typo in comment
Change-Id: I05aa1941f9cc8f3aa5ba873cf134767b56b56b69
2022-09-28 19:14:02 +02:00
Pau Espin c4c6746be7 cosmetic: osmux: Properly separate expressions with whitespace
Change-Id: I524899148da767516c7c1e4bc47b9d3a7b726356
2022-09-28 19:14:02 +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 e36cbdf99e osmux: Proper encoding of osmux frames when when AMR FT changes
The AMR FT (and hence payload content and size) may well change over the
lifetime of an RTP stream. Since all AMR payloads in an osmux batch
share the same FT (its joined payload is calculated based on
osmuxh->ctr*amr_bytes((osmuxh->amr_ft)), if a new RTP/AMR with a
different FT arrives we cannot simply append it to the current batch.
Instead, the current batch must be considered done and a new batch with
anew osmuxh header must be prepared for the resulting osmux frame to
send over UDP.

Before this patch, when a packet with a different AMR FT was submitted
for batching, it would be added in the same batch and decoding would
fail since the sizes of the batches would be wrong.

Related: SYS#5987
Change-Id: I25eb6ee54c898f575cc71ccfd6d190fe51d56dbe
2022-09-28 19:03:52 +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 8a3b1acf35 osmux: assert no batch factor greater than 8 is used
Change-Id: Ie17a8174bc220d091cb7ff880363d22179b4f621
2022-09-27 18:26:48 +02:00
Pau Espin a50895f7eb osmux: Early return on error or batch full during osmux_replay_lost_packets()
If there's an error while replaying lost packets, return the error to
the caller.
If the batch is found full, early return indicating so, there's no need
to continue flow calling osmux_batch_enqueue() in osmux_batch_add()
again.

Change-Id: I62f494d2b2e7903a6683f6dea00781bb721a3d41
2022-09-27 18:24:11 +02:00
Pau Espin d6e8765faf osmux: Unify return codes of osmux_batch_add() and osmux_batch_enqueue()
This way it's way easier to return the error to the caller, and the code
is easier to read.

Change-Id: Ib78c9b82b85c74be2c5e94dae7c212175244d5fa
2022-09-27 18:21:45 +02:00
Pau Espin 845a386dcd cosmetic: osmux: Fix typo in comment
Change-Id: Ieeaa5543e56a824752413dadf161329f5ea0e4e7
2022-09-27 17:37:28 +02:00
Pau Espin fe78dc46ed osmux: Change order of lines to follow packet fill order
The osmux header goes before in the packet, so let's move the line
checking is size before the content.

Change-Id: I33feac834700d22ed06472d8971abd0567ce623b
2022-09-27 17:31:51 +02:00
Pau Espin 414b34e713 osmux: Avoid duplicated RTP msg trigger Tx of osmux frame
The RTP msg will be dropped, so it makes no sense to signal the caller
to deliver the batchbeing built, since it may still have space for next
non-duplicated message.

The exception is the case where the new packet has the M marker bit set,
since the sequence numbers can be reset or jump in those scenarios.

Change-Id: Idc457bc3b26bed68796d714bc3f37a2d016ba5c3
2022-09-27 17:31:22 +02:00
Pau Espin 3de07cf481 osmux: osmux_xfrm_input(): Propagate error code to inform caller
This way the caller can log or make statistics based on the return code.
All known implementations simply check the return code to be >0, so we
are fine here.

Change-Id: I981cc7e560cd9c792a8a2a219b3612f9834296ce
2022-09-23 18:31:03 +02:00
Pau Espin 2f58903376 osmux: Improve logging non-usual conditions
Change-Id: I854b0ae78e7e701ec3cb0525063f7292185d05a3
2022-09-23 17:39:53 +02:00
Pau Espin 668c804197 stream: Provide caller with SCTP flags during osmo_stream_*_recv()
The user may want to check the flags in order to know if the content
pointed at by msgb is an sctp_notification structure, and not in-band
data.
This is useful for the user in order to gain connection state such as
SCTP RESET notification, which means the client reconnected reusing the
same socket, loosing all higher layers state.

The MSG_NOTIFICATION from netinet/sctp.h is not reused, and instead an
osmocom specific flag (and bitmask) is used. This is done in order to
fit the flags in one byte, since for instance MSG_NOTIFICATION requires
2 bytes in my system (0x8000).

Related: SYS#6113
Change-Id: I0ee94846a15a23950b9d70eaaef1251267296bdd
2022-09-19 14:50:34 +02:00
Pau Espin 98c75ef273 stream: Unset fd value after close() before calling closed_cb()
The fd is not valid anymore after close() call, so let's set it to a
clearly invalid value, to avoid confusion on closed_cb() users
attempting to use the fd get info about the socket at that time.

Change-Id: I82d9bdfb38cf5e9f689eca0d9a4c19ddd5541af7
2022-09-13 12:47:33 +02:00
Pau Espin 2087d61c21 stream: Fix typos in log messages
Change-Id: I9e49e222c254c89d182402501024badfd3bf9d9c
2022-09-12 12:44:03 +02:00
Pau Espin 98cc81bc98 osmux: osmux_xfrm_input_close_circuit(): Log circuit not found
Change-Id: I486b81d15b4d9d6abd08fbd73ca460bae22586a9
2022-09-12 12:04:25 +02:00
Pau Espin 95d57c1803 osmux: Allow the user to alloc msgbs used to provide generated RTP packets
This is useful for users of the API which need to keep forwarding the
msgb to lower layers which may need prepending a new header to the msgb,
like osmo-bts with l1sap.

Related: SYS#5987
Change-Id: I632654221826340423e1e97b0f8ed9a2baf6c6c3
2022-09-12 12:04:20 +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 75ae80da03 osmux: Move osmux_xfrm_output_set_tx_cb() further down to the xfrm_output section
Change-Id: I46628d1f712e9c5c56c306e27c34ff45731c0172
2022-09-02 11:20:04 +02:00
Pau Espin 51fa5ad16e osmux: Drop long time deprecated APIs
Those APIs where deprecated 4 years ago (end of Aug 2018), and they have
not been used since around that time. Hence it can be considered safe to
drop them, since they only make the whole code more complex to
understand.

API osmux_xfrm_output_init() is left since openbsc.git is still using
it.

Related: OS#5987
Change-Id: Icbdd364a8161a8113dbf1406716946f684d0a853
2022-09-02 11:19:55 +02:00
Max a69baa9184 Properly handle send() return code
Change-Id: If9b80e855b740254d5414ea50b4ce594855da8e9
2022-08-21 21:46:46 +07:00
Max f7bea130e6 Log more details in osmo_stream_srv_write()
Log error code and amount of data:
both are handy for debugging apps using the library.

Change-Id: I580c00f3b5ade05ecb20a92ce4ece2854334a41f
2022-08-21 20:01:50 +07:00
Pau Espin c8241421bc rtp: Avoid memcpy(len=0)
Change-Id: I7618c6509b67465d21271ea632bccc8cf11e4852
2022-08-11 20:31:18 +02:00
Pau Espin dcae6dd99d stream: getsockopt ret socklen_t is unsigned
Found out by following gcc warning:
"""
libosmo-netif/src/stream.c:147:11: warning: argument to variable-length array may be too large due to conversion from ‘int’ to ‘unsigned int’ [-Wvla-larger-than=]
  147 |   uint8_t buf[sctp_sockopt_event_subscribe_size];
      |           ^~~
"""

Change-Id: I181ae5c0480788fc96abd2bb1edf003244884c8f
2022-07-18 18:18:16 +02:00
Pau Espin 0f067d8809 stream: assert params are not NULL in send/recv functions
Change-Id: Ie9e67396973128aba87b584be1a36e2a94dd0998
2022-07-05 18:26:53 +02:00
Pau Espin 841fe23f9f rtp: Delay rtph ptr assign after validating length
Make coverity happy, since this seems to spread as a tainted error
further below.

Related: Coverity CID#273000
Change-Id: I5d457183043d4c902f473b828815b9c62a01d47d
2022-06-29 18:11:21 +02:00
Pau Espin bea94d8edf Bump version: 1.1.0.14-d1ab-dirty → 1.2.0
Change-Id: I5809e5c85af66db6174a182a936891fa6e1104c1
2022-06-28 18:09:49 +02:00
Philipp Maier d24a436bc7 amr: cosmetic: fix grammer in comment
Change-Id: I01ad26986d925acdcdb3760f89b8a85dccdc3d5b
2022-02-15 14:35:36 +01:00
Pau Espin 2687d8fb72 amr: Fix length check in bwe<->iuup converters
The check was wrong for format types containing extra bits not aligned
to byte boundaries, such as FT7 (AMR Code 12.20, 244 bits, 31 bytes).

if the source has 1-6 extra bits, they can be fit with one less byte
when shifting 10 bits to the left.

Change-Id: I0552d727585886d25f613e64ca815fb6dcd53f25
2022-01-05 20:29:57 +01:00
Pau Espin cee23a7c6f amr: Fix FormatType from parsing BWE AMR header
The proper order is CMR(4)+F(1)+FT(4)+Q(1).

Hence, FT is 3 least significant bits of first byte and 1 most
significant bit of secont byte.

Change-Id: I66f39d3b9a608f07c202e7a5084a8537e9978a94
2022-01-05 18:38:06 +01:00
Alexander Couzens acce44d40f amr: Introduce APIs to convert BE to IuUP/IuFP format
These APIs allow for easy re-formatting of received AMR to forward
between regular RTP and IuUP.

Related: OS#1937
Change-Id: Id2bd32d5f2060abe581730996dc4251381bf7d4f
2022-01-04 14:50:51 +01:00
Alexander Couzens f2c1d4c328 amr: don't rely on pad bits to be zero
Change-Id: I354fbbcbaf7ff7e7d498b22c175a57a79b6b8856
2021-12-31 00:31:32 +01:00
Pau Espin e59472a50a prim: return last error code
Closes: Coverity CID#242768
Change-Id: Ic0f8b313ab9a8de597d8bb6db76e9883bc6009a0
2021-12-16 12:55:46 +01:00
Pau Espin 82a52f6a7d prim: Add internal CTL SAPI to negotiate SAP versions
This commits adds a generic mechanism for applications to validate
support for SAPs and specific versions of them.

A new special SAPI is introduced to manage inbound control messages for
the protocol.
In that SAPI a new primitive HELLO.req/.cnf is added to negotiate
support for versions of any given SAP.
The idea is that the client upon connecting submits a HELLO.req(SAP,
VER) for each SAP it plans to use, including the version of the special
CTL SAPI itself (preferrably to be checked first).
Upon receiving such a message, osmo_prim_srv handles it using a special
path, which ends up calling the user provided rx_sapi_version_cb(SAP,
VER). In there, the user can either:
* Accept the version (return same VER value)
* Reject the requested version but propose another candidate version
  (return some positive VER value other than received VER). In this
  case, the client can decide whether to request another VER or close the
  connection.
* Reject the proposed version and close the connection.

Change-Id: I0c2d92cfdb5433e3caab51d712fd947d51eeef23
2021-12-09 20:21:33 +01:00
Pau Espin 4b6ce34083 Introduce osmo_prim_srv APIs
This new module allows easy exchange of osmo_prim based data types over
IPC communication (UD socket supported only so far), by replacing the
osmo_prim_hdr struct with a serialized header when submitting/receiving
it from the IPC socket.

This patch introduces the server side of the UD socket, but the client
side can easily be introduced in the same file whenever needed.

Related: SYS#5516
Change-Id: I7cab15ac092e45a256c4f0bab11b3962df861044
2021-12-09 16:59:29 +01:00
Pau Espin b2b5f1c6bf stream: Add support for AF_UNIX sockets
Change-Id: I5237a8121be05a9a31a39ca38a6a139062f258c4
2021-12-09 13:47:41 +01:00
Pau Espin 4cf31f187a stream: Factor out sctp_recvmg long code chunk
This makes it easier to follow the general path selection based on
protocol type. It will also make it easier when we add new paths based
on socket domain.

Change-Id: Ia3e0f4407e00a2dac9ee885fe1cc1cb4b463898a
2021-12-01 14:52:47 +01:00
Pau Espin d4a1107586 Introduce sctp.h to provide SCTP related functionalities
These value_strings are taken from existing private ones in
libosmo-sccp.git osmo_ss7.c, and are moved here in order to be
reused by other projects, such as osmo-hnodeb.

Change-Id: Ica6f01851fb94e31f4ef097494bb1b8a95597ba6
2021-11-23 14:18:40 +01:00
Pau Espin 5967fa0058 Bump version: 1.0.0.14-3e65-dirty → 1.1.0
Change-Id: I8e3be883113444251f5008c407e9f722d0dcd422
2021-02-23 16:47:37 +01:00
Harald Welte 637025b2f7 migrate to osmo_fd_{read,write}_{enable,disable}()
Change-Id: Ia8ffcbc61883a4e1615c101dbd3307771ae33974
Depends: libosmocore.git Change-Id Idb89ba7bc7c129a6304a76900d17f47daf54d17d
2021-02-11 15:40:54 +01:00