Commit Graph

31 Commits

Author SHA1 Message Date
Pau Espin 05ff552f25 stream_{cli,srv}: Add 'res' param to read_cb2
Notify user about read errors, similar to what is supported in the
earlier ofd cb backend of osmo_stream_cli/srv:
https://osmocom.org/issues/6405#note-15

Related: OS#6405
Fixes: 5fec34a9f2
Fixes: 0245cf5e07
Change-Id: I395c75ff1e9904757ce1d767a9ac2f779593c4c8
2024-04-18 10:55:13 +02:00
Pau Espin a423e12284 stream: Define types for each API callback
The amount and complexity of callbacks is increasing over time.
Use typedefs to define each of them so that callbacks:
- Are easier to identify (which types is used where)
- Are easier to document (have a 1st class place to write doxygen
  documentation)

Change-Id: Ib0c4a9713fa4c755e457b8c2cbde6a7724d36e28
2024-04-17 13:53:57 +02:00
Pau Espin 554a4b2f9d stream_cli: Remove unused write_cb field
Change-Id: I50bee754d01d8de01f4a25c14abf90275a1ac78e
2024-04-17 13:53:27 +02:00
Andreas Eversberg 5fec34a9f2 stream_cli.c: Handle read / recvfrom error and close connection
If read or recvfrom fails or returns 0, the connection must be closed.
This is already done when a write / send fails. In both cases the
disconnect callback is called to notify the user's client.

Not handling the error may cause an infinite loop of read or recvfrom
failures.

Related: OS#6405
Change-Id: I55426de6b49cb4cb0797e50dfeae11f2efc29b15
2024-03-22 07:34:32 +00:00
Harald Welte 34a657d1e1 introduce osmo_stream_cli_get_iofd() API
Using this, a user can obtain the osmo_io_fd, for example in order to
perform configuration like osmo_iofd_set_alloc_info() or
osmo_iofd_set_txqueue_max_length().

Change-Id: Ie19c8294ddb12dfe5e0fd44e047c47e6f9cbd384
2024-03-17 17:41:22 +00:00
Harald Welte 912360157d docs: Split Stream Server and Stream Client into separate groups
This provides us with proper logical separation between client and
server in the documentation.

Change-Id: I9e037fedaecb78396f435577b1652284b4951ded
2024-03-15 14:14:07 +01:00
Harald Welte 8963af0f60 docs: More verbose stream_{cli,srv} API documentation/manual
Change-Id: Iae3c3af6533be408e5755ceeda0067606a3b0ca1
2024-03-15 14:13:32 +01:00
Harald Welte 104265733f Ensure osmo_stream_{cli,srv}_recv() is used only in osmo_fd mode
The osmo_stream_{cli,srv}_recv() is only for osmo_fd mode users; in
case osmo_io mode is used, the read_cb is called with pre-filled message
buffers; no need to recv/read directly anymore.

Change-Id: Ie96cf1241b2ba4e0a7dda584182d18cad2b4f061
2024-03-15 14:13:32 +01:00
Harald Welte 472354b693 docs: Use \defgroup and avoid repeated boilerplate text
Change-Id: I1196c3b035f495c5dbaa4d47ce3f79a08d0727f2
2024-03-15 14:13:31 +01:00
Pau Espin 36eb157ed6 stream: Add osmo_stream_*_get_name() APIs
This allows users to retrieve a previously set name.

Change-Id: If5054d3c207f8f5d58a448f1e58266ad9c4386dd
2024-03-13 11:57:47 +00:00
Harald Welte c17dc5f559 osmo_stream_cli_send(): Drop data if client is not connected [yet]
The behaviour is undefined on what should happen if a stream client user
is trying to write data before the client socket is connected.  In
osmo_io mode we would actually crash due to a NULL-pointer dereference.

Let's discard any sent data in this situation and print a related error log message.

This problem actually shows up with osmo-bsc Change-Id
Icce412e6ee69366c7b131c9bc1d51e8d44204917 where we convert CBSP over to
osmo_io - here in situations where a CBSP client (using stream_cli) was
previously connected but has lost its connection.

Change-Id: I18d2e8e850c23a32f5983a715fa8a18747b296cd
2024-03-12 17:36:02 +00:00
Andreas Eversberg e1153bcd37 stream_cli: Correctly setup and free osmo_io client instance
Free osmo_io instance when calling osmo_stream_cli_close().
Also free osmo_io instance when calling osmo_stream_cli_open() if not
freed, to prevent memory leaks.

osmo_iofd_notify_connected() must be called before any registration
of read or write, because osmo_io_iouring does not allow this.

Change-Id: I91a6a76b9ff96034a7b333edf87af27490202932
2024-03-07 10:28:17 +01:00
Vadim Yanitskiy 1eb221a923 osmo_stream_cli_write(): fix double-free of msgb
Change-Id: I954678acd90593e5311d22a10033c7741f280be3
Fixes: 48f9a3c2 "stream_cli: Proper handling of send() socket errors"
2024-03-05 17:05:50 +07:00
Andreas Eversberg da3ca9a69e stream_{cli,srv}: Free received messages when not forwarded
If a message is not forwarded (to a read callback function, it must be
freed, to prevent memory leaks.

The message musst be freed before calling osmo_stream_srv_destroy() or
stream_cli_handle_connecting(), because within the function calls the
client/server instance may get destroyed and the message is 'owned' by
it. Calling msgb_free(msg) afterwards may result in double free bug.

Related: OS#5753
Change-Id: Ic043f11cdba0df9e0b78cac8db7206800098e0ba
2024-03-02 09:21:43 +00:00
Harald Welte 313f528027 osmo_io: make use of osmo_iofd_get_ioops()
This avoids resetting the callbacks with the wrong ones in the SCTP
case.

Change-Id: Id3cb11bc0000299faa79d980de8abc1980916d70
2024-03-02 09:18:00 +00:00
Andreas Eversberg d467b6348c stream_{cli,srv}: Fix memory leak, if sending a message fails
Also the example client/server must not access msgb after sending it,
especially if the msgb got freed due to a failure.

Change-Id: I627a71b4f0183cd83835c328a5cdd67a413ae614
2024-02-29 13:23:20 +01:00
Harald Welte 7e6d2e0f99 stream_{cli,srv}: Add support for SCTP in OSMO_IO mode
Let's enable the OSMO_IO_FD_MODE_RECVMSG_SENDMSG mode for SCTP
sockets, allowing OSMO_STREAM_MODE_OSMO_IO to be used with SCTP.

Change-Id: I6cf5bad5f618e71c80017960c38009b089dbd6a1
Depends: libosmocore Change-Id: I89eb519b22d21011d61a7855b2364bc3c295df82
Closes: OS#5753
2024-02-29 13:23:13 +01:00
Pau Espin d4407a7f32 stream_cli: osmo_stream_cli_get_sockname() now returns the full set of addresses
This is used by API callers, and internally to log
connected/disconnected events.

Related: SYS#5581
Change-Id: I249ee7cad824cf971faabe06d10de2426c1b0c8b
2023-12-08 18:43:31 +01:00
Pau Espin a15d8f7f20 stream_cli: Fix opening sctp client socket if no local address set
Properly call osmo_sock_init2_multiaddr2() to use default binding
address if user of osmo_stream_cli didn't set one on the object
through the API.
osmo_sock_init2_multiaddr2() was also borken under that scenario until
recently (see Depends below). Until now, users of osmo_stream for SCTP
(mainly libosmo-sccp) relied on always setting a proper local address to
overcome this limitation.

Depends: libosmocore.git Change-Id I2641fbaca6f477404b094dbc53c0c1a3dd3fd2fd
Related: OS#6279
Change-Id: I0d9d0e48690c915f7b51ad09f452e551e01368b5
2023-12-06 13:46:28 +01:00
Harald Welte 5ccee1e1b1 Introduce generic osmo_stream_{cli,srv}_get_fd() API
The old osmo_stream_{cli,srv}_get_ofd() API only works for streams
in OSMO_FD mode.  However, it is legitimate for an application
wanting to get low-level access to the file descriptor, for example
to issue some {get,set}sockopt() calls on it.

Change-Id: Ib0737f21150f6ac8d524b92c7ddb098f2afdeaab
Related: OS#5753
2023-11-21 20:25:21 +01:00
arehbein bc496b1db0 stream: Add client-side (segmentation) support for IPA
With this commit, IPA segmentation is taken care of by setting the
segmentation callback provided by libosmo-netif.

The ipa-stream-server example needs to prepend IPA headers now because
those are stripped by the segm. cb on both sides.

Depends: libosmocore.git I3a639e6896cc3b3fc8e9b2e1a58254710efa0d3f

Related: OS#5753, OS#5751
Change-Id: I822abf52c6ae396c90b5c50228a0a39c848d3de6
2023-10-02 13:40:01 +00:00
Pau Espin 745c0e2a0f stream: Add new stream_{cli,srv_link} parameters to set SCTP_INITMSG sockopt values
This will allow osmo_stream users (like libosmo-sccp) to set
SCTP_INITMSG related parameters, like number on inbound/outbound
streams, connect attempts, connect timeout.

Related: SYS#6558
Change-Id: I5343c7659881b29e0201e72badbc2d07e1ef2dca
2023-09-12 00:01:00 +02:00
Pau Espin efd56fb2a2 stream: Introduce API to set several transport parameters
This will allow extending capabilitites to set different parameters at
the lower layers as we need them.

This commit changes the behavior of osmo_stream_{cli,srv_link}: It now
doesn't enable by default SCTP AUTH/ASCONF features using setsockopt. It
is left up to the user of the API (libosmo-sccp in this case) to set it.
Since this unilateral use of setsockopt() has only been added recently
and we didn't release yet, it's fine changing it. libosmo-sccp will be
changed to unconditionally set its using setsockopt. It is left up to
the user of the API (libosmo-sccp in this case) to set it.

Related: SYS#6501
Related: SYS#6558
Change-Id: I2607c1c926a625986cd851adc65dd8b4de83d6ab
2023-09-08 17:53:21 +02:00
Pau Espin 839c90e149 stream: Use new libosmocore API osmo_sock_init2_multiaddr2()
Use the new API available in libosmocore to set sockopts related to
ASCONF SCTP features. The old flag OSMO_SOCK_F_SCTP_ASCONF_SUPPORTED has
been dropped. This only affects master builds since there's no release
ever done with that flag defined.

Depends: libosmocore.git Change-Id I1f6fd09a79b0a2bd794e5669d933be25bbf1eeaa
Related: SYS#6501
Related: SYS#6558
Change-Id: I2b2073de72625b4f4f99892179c9406163d28592
2023-09-08 13:15:56 +02:00
Pau Espin 74b626282c stream: Use new flag OSMO_SOCK_F_SCTP_ASCONF_SUPPORTED for SCTP sockets
This is required if the user of the stream API wants to use SCTP extra
features such as setting the Peer Primary Address through ASCONF.

At a later point we may want to add new osmo_stream APIs to set extra
flags for the socket, or maybe simply add a new API specifically to
enable ASCONF for the stream.

Depends: libosmocore.git Change-Id Iac07031927b66a9d32d2bb2faab817e4c922a359
Related: OS#6076
Change-Id: I807b3748b8535d8e75ceea812d7baaf153fa1d60
2023-08-21 10:25:57 +02:00
Pau Espin 18c160a012 stream_cli: Forward SCTP MSG_NOTIFICATION to upper layers
Same mechanism as already used in stream_srv.

Change-Id: I4cb94d264109f1b763cccd44c6ba049cc7509319
2023-08-21 10:25:54 +02:00
Pau Espin 48f9a3c27f stream_cli: Proper handling of send() socket errors
Upon EAGAIN, simply re-enqueue the message and return waiting for next
poll. Upon any other error, force close + reconnect.

Related: OS#6134
Change-Id: I462cb176ebc51f3e99ee796310e8665144c84ccc
2023-08-07 19:16:24 +02:00
Pau Espin a69a958ae3 stream: Append data to current tail of message upon recv()
The previous behavior was not standarized, and even erratic under some
code paths (passing msgb_data() and size=msgb_tailroom()).
This patch standarizes the behavior, and makes it possible to append
content if the user wishes so instead of erasing old data in the msgb
passed to it.

Change-Id: I2cfcd4f61545e6a76d84495c3467999efccf22df
2023-08-07 19:16:24 +02:00
Pau Espin 7e68ac2c04 stream_srv: call setsockopt(SO_NOSIGPIPE) also in srv sockets
Commit 5b0ad8bd85 added call to
setsockopt(SO_NOSIGPIPE) in order to avoid SIGPIPE being signalled on
platforms not supporting send() flag MSG_NOSIGNAL (macOS, FreeBSD
etc...).
While it may be a topic to discuss whether we support those platorms or
not, the fact that we call an extra setsockopt() during socket creation
doesn't hurt much, and for sure we want to have the same behavior in
client and server.

Hence, this commit adds the same behavior pesent in srv sockets to cli
ones.

Change-Id: I867d8e244e473679abb7e7e7a9b531eeed046436
2023-08-07 19:16:24 +02:00
Pau Espin 1f7c44a17c stream_cli: Increase log level of established conn to INFO
Change-Id: I49776db0b12ee46b629381d2fa2b501c2a63e390
2023-08-07 19:16:24 +02:00
Pau Espin 7fe21f67f6 stream: Split cli/srv specific code out of stream.c
The dev/user in general is only interested about one side of the stream
when looking at the code. Since the stream.c file is tarting to be quite
large/bloated, this patch splits its content into stream_cli.c and
stream_srv.c to make it easier to improve/extend and review.
Keep common code between cli and srv in stream.c, and add a private header
to contain references to it.

Change-Id: I22af01bba2040eb320ba48fd1b46c090c98be159
2023-08-04 13:28:50 +02:00