Commit Graph

106 Commits

Author SHA1 Message Date
Harald Welte c380f29c0c osmo_io: Reject unknown/unsupported modes in osmo_iofd_setup()
The current code does not check the value range of the 'mode' parameter
and would later run into OSMO_ASSERT(), rather than rejecting such a
mode from the very beginning.

Change-Id: I10dd612487638f456d0ad59c2cca203f1e098da3
Related: OS#5751
2023-11-22 12:20:12 +00:00
Harald Welte 38d8170fa4 osmo_io: rename unsupported SCTP mode to OSMO_IO_FD_MODE_SCTP_RECVMSG_SEND
The two functions of the SCTP socket interface we use in osmo-* are
sctp_send() and sctp_recvmsg().  We do not use sctp_sendmsg() at all,
so let's make sure the mode is named correctly.

Change-Id: Ie2d1c7ce6f211dbe025a0e843ad733443102ea15
Related: OS#5751
2023-11-22 12:20:12 +00:00
Harald Welte 987a86af88 io_uring: add some more source code comments/docs
Change-Id: I8ba77a18b51f67a9edbd1fa488b9791f8bf6e40a
2023-11-22 12:20:12 +00:00
Harald Welte 641cc3c60d add new osmo_sockaddr_from_str_and_uint() function
The function is basically a shortcut for getaddrinfo with storing the
output data into our 'struct osmo_sockaddr'.

Change-Id: I6b5c0bf8ca97e6358d992fb2ff45ffd53ba15197
Related: SYS#6657
2023-11-22 12:18:26 +00:00
Daniel Willmann afdfc6a034 osmo_io: Assert that iofd mode is correct when calling *_write_msgb
Change-Id: Ief82ba7f9b280f85d66d68c358c36ba9866fe47a
Fixes: OS#6264
2023-11-21 21:02:13 +00:00
Vadim Yanitskiy 459cb06912 soft_uart: check n_bits against 0 in osmo_soft_uart_tx_ubits()
Currently calling this function with n_ubits == 0 would result in
requesting one character from the application (via the .tx_cb()),
but not actually transmitting anything.  Make it return early.

Change-Id: Icbf99a9f2f6fa64dd71a5f37922f9001577c6c97
Related: OS#4396
2023-11-21 20:17:11 +07:00
Vadim Yanitskiy ffdd99779d soft_uart: fix pulling a small number of Tx bits
Change-Id: I454c8786697a6f2389d56b350e6e20ca953fe859
Related: OS#4396
2023-11-21 20:17:11 +07:00
Vadim Yanitskiy 0d78a00b9f soft_uart: implement OSMO_SUART_PARITY_{MARK,SPACE}
Change-Id: I4c8fe5bfdcc2f4eb52c259d1e62d06684cd8f823
Related: OS#4396
2023-11-21 20:17:11 +07:00
Vadim Yanitskiy 2d2ce49e52 soft_uart: fix handling of num_data_bits < 8
Change-Id: Ife13b1f2d9063ba7253d01523ca9ecb15e9eaf07
Related: OS#4396
2023-11-21 20:17:11 +07:00
Vadim Yanitskiy bf95f82291 soft_uart: fix Rx buffer flushing logic in suart_rx_ch()
Whenever we encounter a parity and/or a framing error, we should
call the .rx_cb() immediately, even if this was the first
character in the receive buffer.

Change-Id: I73fab1a5c196d2dbdfe98b0c20d8dadbd22f4f64
Related: OS#4396
2023-11-21 20:17:11 +07:00
Vadim Yanitskiy 03f0ed78ef soft_uart: allow manually flushing the receive buffer
Change-Id: Id600a2db99e6cb84866cbdcfcd4f78265e067291
Related: OS#4396
2023-11-21 18:50:09 +07:00
Vadim Yanitskiy c9fc77f541 soft_uart: implement the transmitter
Change-Id: Ibcd9643227e5616efd8bbd7a1430feda6fcef45c
Related: OS#4396
2023-11-21 00:58:53 +07:00
Vadim Yanitskiy 1c2b8c1eb7 soft_uart: implement parity checking for the receiver
Change-Id: I28be2ca19d423447a718fb518566d52ae1967ec7
Related: OS#4396
2023-11-21 00:58:53 +07:00
Vadim Yanitskiy 1a3b511b32 soft_uart: rework osmo_uart_rx_bit() to use flow state
Change-Id: I40ab5d12b6f7087daa51405468f5c4ea639561ea
Related: OS#4396
2023-11-21 00:58:53 +07:00
Vadim Yanitskiy 82a1ae785e soft_uart: make osmo_soft_uart_alloc() accept *cfg
Let the API user pass their own default config when allocating
a soft-UART.  Make the default config publicly accessible.

Change-Id: I7e78d60c747a8805064d5e4bacfd47a30bc65cba
Related: OS#4396
2023-11-21 00:58:53 +07:00
Vadim Yanitskiy cdde67186b soft_uart: split osmo_soft_uart_enable()
The problem with a single function controlling both Rx and Tx is
that enabling/disabling one of the directions requires knowing
state of the other one.  In other words, disabling Tx requires
knowing the state of Rx, which may be inconvenient.

Change-Id: Ieacc7e639304eeb14fdb298c7e14d772c136ca6e
Related: OS#4396
2023-11-21 00:58:53 +07:00
Vadim Yanitskiy b72625d40e soft_uart: add doxygen documentation
Change-Id: Ib0dcea0c35619bda5626cf75044000951b26485b
Related: OS#4396
2023-11-21 00:58:53 +07:00
Vadim Yanitskiy 877cfed3b2 soft_uart: add osmo_soft_uart_free()
Change-Id: I2fdcf6116144d8f16cf4167c37cfa7215d16337f
Related: OS#4396
2023-11-21 00:58:53 +07:00
Harald Welte dc023cfc2e core: Add software UART implementation
This patch brings a Work-in-Progress implementation of the software
UART (Universal Asynchronous Receiver/Transmitter) to libosmocore.

Not only it will be useful in the context of retro-networking, but
also it's needed for the MS-side CSD implementation (see OS#4396).

It should be noted that the definition of struct osmo_soft_uart
is intentionally kept private, since the API is not stable yet.

Currently, the following limitations apply:

* Only the receiver part is implemented, the transmitter is TBD.
* Parity checking is not implemented in the receiver part.
* Software flow control is not implemented.

These missing components will be addressed in subsequent patches.

Change-Id: I2ca95963fd5852ddb89bdd35b86b31489127fe84
2023-11-21 00:58:53 +07:00
arehbein 90d79f4eac gmstap_util: Fix sending out gsmtap messages
Previously undetected, because the vty command 'gsmtap log ...' never used write queue mode

Change-Id: I88ba8984518d2d0327cfacd0d2cdf33c7e1d091b
2023-11-17 18:52:58 +01:00
arehbein f67e45828d gsmtap_util: Simplify sink
- Instead of using the osmo_fd API to call read() on the socket's file
   descriptor each time (unused) data is received, simply open the
   socket and never read

Related: OS#6213
Change-Id: I4025920d5f62d17133e9b5fe81cd34a88c4f20b5
2023-11-15 21:29:23 +00:00
arehbein f38077ee6a gsmtap_util: Use Osmo IO instead of Osmo write queues
- Adapt decl. of 'struct gsmtap_inst' for usage of Osmo IO while maintaining backwards compatibility
 - Maintain legacy behavior without any message queues if osmo_io_mode is zero

Related: OS#6213
Change-Id: Iadbbef74e3add7001d84dd6b68f51eac293e44d0
2023-11-09 12:48:07 +00:00
Daniel Willmann f2629675aa logging_gsmtap: Temporarily disable logging when sending the logs
This avoids an infinite recursion when sending a gsmtap log message
causes a log message.
Temporarily set target->loglevel higher than LOGL_FATAL, which
effectively disables logging for that target. Other targets like stderr
will still log this message so there is still an indication that
something went wrong.

Change-Id: I19203cadbad6019a3834793b8ac816d903fe088e
Related: OS#6213
2023-11-09 19:34:37 +07:00
Manawyrm 11a416827d logging: ensure ANSI color escape is sent in same line/before newline
This fixes multi-line color clobbering in logging daemons like
systemd-journald, which work with single-lines only.

Change-Id: Ia7de9d88aa5ac48ec0d5c1a931a89d21c02c5433
Closes: OS#6249
2023-11-07 16:50:22 +00:00
Pau Espin e4f34d8d0a socket.c: Fix compilation with --disable-libsctp
Fixes: 64ba9edf17
Related: OS#6234
Change-Id: I988d01461822d18b7350a6e69e3b504f7fd5b84f
2023-10-23 09:58:50 +00:00
arehbein a59e8d7c1d write_queue: Fix Doxygen comment
Change-Id: Ib2508411ae46e2456466beaae63d3f401e34d0d4
2023-10-20 20:55:54 +00:00
arehbein 2e2a0a1561 osmo_io_poll: Handle -EAGAIN in case of OSMO_FD_WRITE
Related: OS#6213
Change-Id: I59c86370d13f2bb33c289d1b177df895726975cb
2023-10-20 10:00:32 +00:00
arehbein 1584b2ac39 gsmtap: Hide implementation of gsmtap_inst
- Use forward decl. of struct gsmtap_inst in header
 - Remove 'static inline' attributes from gsmtap_inst_fd() declaration,
   move function definition to gsmtap_util.c and mark it as deprecated
 - Add gsmtap_inst_fd2() as replacement for gsmtap_inst_fd()

Related: OS#6213
Change-Id: Ibe1a51205a6df764571b6d074e365825555609a5
2023-10-13 01:33:46 +02:00
Pau Espin 9519d8d27a Fix typo in libosmocore.map
Fixes: 64ba9edf17
Change-Id: I0fb13fb4ef8160f3ac2cb1cb4dd6ea57fd04b5be
2023-10-05 16:50:32 +02:00
Pau Espin 64ba9edf17 socket: Introduce APIs osmo_sock_multiaddr_{add,del}_local_addr()
These APIs are used to bind or unbind an active socket adding or
removing addresses from the existing set.

Related: OS#6077
Change-Id: Ifc6e7d643c2a0c53f479bfd0d5c36d08c0c01953
2023-10-03 18:38:02 +02:00
Daniel Willmann 2386e9a7e2 osmo_io: Only allow reading/writing if the relevant callback is set
Allow the callbacks to be NULL, but then sending/receiving is disabled.
There are some cases where we only care about writing to or reading from
an fd.

Change-Id: I11ce072510b591f7881d09888524426579bd0169
2023-09-28 17:51:05 +02:00
Daniel Willmann 435856be51 osmo_io: Init struct msghdr to zero
Avoid uninitialized read, found with valgrind

Syscall param recvmsg(msg) points to uninitialised byte(s)
   at 0x49FD865: __recvmsg_syscall (recvmsg.c:27)
   by 0x49FD865: recvmsg (recvmsg.c:41)
   by 0x4891FAE: iofd_poll_ofd_cb_recvmsg_sendmsg (osmo_io_poll.c:66)
   by 0x48921B2: iofd_poll_ofd_cb_dispatch (osmo_io_poll.c:119)
   by 0x48941F1: poll_disp_fds (select.c:419)
   by 0x4894299: _osmo_select_main (select.c:457)
   by 0x4894304: osmo_select_main (select.c:496)
   by 0x10DC3E: test_segm_ipa_stream_srv_run (stream_test.c:628)
   by 0x10E2A5: main (stream_test.c:879)
 Address 0x1ffefffa68 is on thread 1's stack
 in frame #1, created by iofd_poll_ofd_cb_recvmsg_sendmsg (osmo_io_poll.c:45)

Change-Id: I21114ad57784126cfdeb4a932ed44dbf23946fbe
2023-09-27 11:14:02 +02:00
arehbein ae07127f73 write_queue: Enable updating max_length field
Dequeue and free any excess messages, in case the new queue length
is shorter than the old.

Related: OS#5774
Change-Id: Ibfe51a2faf29f8ae160a9c330c9af0d09b5a9002
2023-09-19 18:46:09 +00:00
Pau Espin aca2c724ae Bump version: 1.8.0.252-13c29 → 1.9.0
Change-Id: I6f8eccbccb73c6c094f13f2d4bdee931cf5b9010
2023-09-12 13:15:54 +02:00
Pau Espin a45b0be25f socket: Support setsokopt SCTP_INITMSG in osmo_sock_init2_multiaddr2()
This allows setting several socket paramets which can only be set before
SCTP INIT phase (connect()).

Since no release with osmo_sock_init2_multiaddr2() happened yet, we are
allowed to extend struct osmo_sock_init2_multiaddr_pars without bumping
the version field.

Related: SYS#6558
Change-Id: Ibc55932d954279927d1e70ccce1e8bf32b180d44
2023-09-08 13:49:59 +02:00
Pau Espin 658c509061 socket: Remove OSMO_SOCK_F_SCTP_ASCONF_SUPPORTED, add osmo_sock_init2_multiaddr2()
The OSMO_SOCK_F_SCTP_ASCONF_SUPPORTED flag was added recently to enable
use of ASCONF in osmo_sock_inti2_multiaddr. Since we didn't release yet,
we are still in time to get rid of this flag.

It turns out that we'll want to add more features which must be set
before SCTP INIT (connect()) time, like setsockopt SCTP_INITMSG, which
in turn contains a struct with several parameters.
Hence, adding flags for all those makes no sense.
Instead, add a new API which allows passing an extensible struct which
allows much more fine-grained setup from the caller.

The new struct "pars" parameter is non-const on purpose, in order to be
able to extend the struct in the future if we wish to get/obtain some
data from the socket.

Related: SYS#6501
Related: SYS#6558
Change-Id: I1f6fd09a79b0a2bd794e5669d933be25bbf1eeaa
2023-09-08 13:49:08 +02:00
Daniel Willmann ec7d491589 osmo_io: Use local variable to reference msghdr->msg
Change-Id: I336ef7a5460dd18bf8e0f4ac5e97747f9fec5a35
2023-08-31 14:28:13 +00:00
Daniel Willmann f39c23f918 osmo_io: Change parent of msghdr to iofd (instead of msg)
msg was made a parent of msghdr after discussion in change
I3a279b55a3adff96948120683c844e1508d0ba94

It turns out this violates some assumptions made in osmo_io,
specifically that the user read callback shall free msg, but we expect
msghdr to remain valid until after that callback returns.

In general I think it is cleaner to make iofd a parent of msghdr.

Change-Id: I41277190e3020cd8fa625bd57a743973e2a65c4b
2023-08-31 14:28:13 +00:00
Pau Espin b437f80e89 socket: Avoid aborting socket creation if setsockopt for ASCONF fails
Avoid aborting the entire socket creation, since those sockopt are fairly
new in the kernel (v5.4), and the feature can still be enabled in older
versions system-wide with sysctl. The worst it can happen is that the
ability to submit address updates (such as Peer Primary Address) doesn't
work, which is not really critical.

Related: SYS#6501
Change-Id: Iff261c8592b6b3c4237c90c84b4e8e921e3c4a65
2023-08-28 13:59:03 +02:00
Daniel Willmann f91d2aac9d osmo_io: Add io_uring backend
Change-Id: I5152129eb84b31ccc9e02bc2a5c5bdb046d331bc
2023-08-24 17:33:19 +02:00
Daniel Willmann 012d9044a2 osmo_io: Avoid potential double free when sending msgb
Ensure that a msgb  has the proper talloc parent:

All msgbs inside an iofd get the iofd as parent. Received msgbs are reparented
to iofd->msgb_alloc.ctx (which was set in osmo_iofd_setup()) before
being passed to the receive callback.

Before this change the code could fail for msgbs that are submitted via uring
where the (failed) write returns after the iofd has already been
osmo_iofd_free()d. free()ing the iofd is deferred until the write
completes, but the (iofd) parent context could have been free()d in the
meantime.

Change-Id: I3a279b55a3adff96948120683c844e1508d0ba94
2023-08-24 17:13:33 +02:00
Daniel Willmann 2b34e92d0e osmo_io: Add iofd_handle_recv()
Handle msg reception in a common function that can be called from the
different backends.

Change-Id: Ifc407d446805f885d37767f421ff710cb276a01f
2023-08-24 14:46:51 +00:00
arehbein cd23806264 select: Prevent negative index lookup on osmo_fd_lookup.table
Marked as WIP because I'm not entirely sure if negative index lookups
were allowed on purpose (although I doubt it)

Change-Id: Iba81873cbc435229599b1a8139cf4b627f8e6924
2023-08-23 17:10:13 +00:00
Pau Espin e83227f735 socket: Add osmo_sock_init flag to enable SCTP ASCONF features
The SCTP_ASCONF_SUPPORTED sockopt, which enables ASCONF features
for the SCTP associations managed by the SCTP socket, gets its default
value from to sysctl "net.sctp.addip_enable", which, at least up to
current kernel 6.4.8 is set to "0" (disabled) by default.
As a result, ASCONF related features such as
setsockopt(SCTP_SET_PEER_PRIMARY_ADDR) fail with -EPERM
since ASNCONF extensions where not negotiated during the SCTP init
handshake.
This commit adds support for setting SCTP_ASCONF_SUPPORTED=1 during
socket creation, since that needs to be applied before the first
bind()/connect() (before first assoc is created).

Furthermore, for ASCONF features to work properly, the assoc also needs
to announce/use the AUTH extension, as per RFC5061 section 4.2.7.
Otherwise, the peer receiving an SCTP INIT with
ExtensionFeatures=ASCONF,ASCONF_ACK but without AUTH, will reject the
assoc with an ABORT since it's not complying with spec (this behavior
can be tweaked through sysctl "net.sctp.addip_noauth_enable").

The AUTH extension is enabled through sockopt SCTP_AUTH_SUPPORTED, and
its default value is that of sysctl "net.sctp.auth_enable", which is
also disabled (0) by default.

Kernel support for those is relatively new:
SCTP_FUTURE_ASSOC added in: 80df2704a375bb4b3c9c5cce9c00052361b16d61
Follows: v5.0-rc4
Precedes: v5.1-rc1

SCTP_ASCONF_SUPPORTED added in: df2c71ffdfae58961981d7cbcccea93688fc4e96
Follows: v5.3-rc5
Precedes: v5.4-rc1

SCTP_AUTH_SUPPORTED added in: 56dd525abd56f7acd7b44a52935726e3ada4916c
Follows: v5.3-rc5
Precedes: v5.4-rc1

Related: OS#6076
Change-Id: Iac07031927b66a9d32d2bb2faab817e4c922a359
2023-08-21 10:28:11 +02:00
Daniel Willmann 92efac26d7 osmo_io: Use MSG_NOSIGNAL to avoid SIGPIPE on write
Change-Id: I85433124a8e80fc2aa19b551bdaf2655ef1eea2c
2023-08-08 10:02:33 +02:00
Daniel Willmann f083382b9c osmo_io: Ensure correct ownership of msgb when sending
Use talloc_steal() if a msg is passed in to osmo_io when sending. This
avoids the message being free()d early in case the original parent is
free()d.

Change-Id: Ie36bd68a8bd63e67d76fb41996f8fdf99f51d96c
2023-08-08 10:02:33 +02:00
Pau Espin a2d8bf8acc exec: osmo_system_nowait2(): Improve logging and error checks
Change-Id: I9b971dda389fe958627d41fa5ba6f45ee588bf99
2023-07-25 15:22:14 +00:00
Daniel Willmann 97d21447f7 osmo_io: Fix length calculation in iofd_handle_segmentation()
We need to account for the fact that segmentation_cb() could have
changed the length by calling msgb_pull(). Calculate the new len
according to the new tail/data pointers.

Change-Id: I5486ddc0d3345e92b20cbc6e5bcf2cefea3958c8
2023-07-18 09:58:47 +00:00
Daniel Willmann d0d9ecbad1 osmo_io(cosmetic): End in a dot for doxygen AUTO_BRIEF
Change-Id: I397304eed524db12e60a6534d21ea268f304cfdc
2023-07-18 06:30:28 +00:00
Daniel Willmann 4731e71a79 cosmetic: Fix doc comment
Change-Id: Iec614004a0382534f4bfcc375f4d89192d7f27aa
2023-07-18 06:30:28 +00:00