aboutsummaryrefslogtreecommitdiffstats
path: root/src/core
AgeCommit message (Collapse)AuthorFilesLines
2024-03-14core: fix missing '\n' in iofd_uring_connected_cb()Vadim Yanitskiy1-1/+1
Change-Id: I43df86cdbd3e52d4f8f7bc0e48478b6f9b288e9f
2024-03-14io_uring: check all operations in osmo_iofd_uring_init()Harald Welte1-4/+17
check all operations in osmo_iofd_uring_init() and panic if any of them fails. Change-Id: I03752c0114cc6fad0c31fff6fff43072f36a50a7
2024-03-14io_uring: more verbose error messages if io_uring setup failsHarald Welte1-2/+2
"Assert failed 0 osmo_io_uring.c:94" is rather useless in terms of an error message. Let's improve upon that. Change-Id: I0ac9ae59e99c3704b3ce33919c9e7d11024476e3
2024-03-12socket: Add remote PID and local FD to AF_UNIX socknamePau Espin Pedrol1-3/+28
This allows identifying precisely an AF_UNIX socket. Change-Id: Ic465e557ea49de8e044d1ef6d91fc3c852c88ff2
2024-03-12socket: Support AF_UNIX in osmo_sock_get_name_buf()Pau Espin Pedrol1-7/+46
Right now stream_cli/srv print "<error-in-getsockname>" when using an AF_UNIX socket. This commit fixes the problem. Change-Id: I224c3712a029ee338ee1209a67d820b887170910
2024-03-08osmo_io_poll: Use -errno as result on write errorAndreas Eversberg1-1/+1
This was done for read error in a previous patch. This is required because osmo_io_uring does not support errno, instead it uses the result code. To have a unified API, set the result code equally. Related: OS#5751 Change-Id: I405094449a6644db37534757f2fbccbcff982f23
2024-03-07osmo_io: Avoid implementing non-existant situationsHarald Welte1-7/+4
Both of our back-ends have a register_fd and unregister_fd back-end. Let's simplify the code by not treating them as optional, which introduces code paths that we never take, adds small runtime overhead and makes the code harder to follow. Should we ever introduce more backends which might not need those call-backs, we can either have empty functions or think about how to make them optional. Change-Id: I0077151eb676f61320b3fa2124448852aa8fd4a9
2024-03-07osmo_io: avoid OSMO_ASSERT one each API callHarald Welte1-2/+7
There's only one way to set the osmo_iofd_ops, which is by environment variable during the constructor time at shared library load time. There's hence no point in doing OSMO_ASSERT() on each and every call to osmo_iofd_notify_connected() at runtime. We can move those kind of asserts to the one-time load-time constructor instead. At the same time, we can extend those asserts to all the mandatory call-backs to be provided by the backend. Change-Id: Id9005ac6bb260236c88670373816bf7ee6a627f1
2024-03-07osmo_io: Don't pretend to support backends without close_cbHarald Welte1-2/+2
Let's not pretend we support backends without a close_cb. In such situations nobody would actually close(2) the file descriptor, but we would set iofd->fd to -1, effectively creating a file descriptor leak. Both of our two back-ends provide a close_cb, and we don't need to consider hypothetical future back-ends that would not like to register such a call-back. Related: OS#6393 Change-Id: Id285f1d7b73ae5805aa618897016ae8b73bf892d
2024-03-07osmo_io: Log error message in case call-backs incompatible with modeHarald Welte2-2/+16
Change-Id: I50ba6a76c0144f249d67488874a6c4edf01ec6f2
2024-03-07osmo_io: Guard osmo_iofd_register() with invalid file descriptorHarald Welte1-0/+5
Let's return an error if both osmo_iofd_setup() and osmo_iofd_register() are called with an invalid file descriptor like -1. Either one of them must have been called with a valid file descriptor. Change-Id: Ie4561cefad82e1bf5d37dd1a4815f4bc805343e6
2024-03-04osmo_io: do check_mode_callback_compat() only if ioops is set at ↵Andreas Eversberg1-1/+1
osmo_iofd_setup() Setting ioops is optional when calling osmo_iofd_setup(). If it is not set, do not call check_mode_callback_compat() to check for compatibility. Closes: Coverity CID#349578 Change-Id: I1e25f3e420f25a44cbf73a4da9a498b7561e9ddd
2024-03-02osmo_io_uring: Check if osmo_fd_register fails at iofd_uring_notify_connected()Andreas Eversberg1-2/+4
If it fails, do not set the IOFD_FLAG_NOTIFY_CONNECTED flag and log an error message. Closes: Coverity CID#349579 Change-Id: I34e8cc9a2b9df0c624841e5f9268a15c32418da1
2024-02-29osmo_io: Assign const name when stealing TX msg from iofd ctxAndreas Eversberg1-3/+1
All TX messages are moved from iofd instance to the user's context. iofd may be destroyed, but the message is still available to the user. To prevent a use-after-free bug, the context name must be changed from iofd->name to a constant that does not belong to iofd. Change-Id: Ib8dae924fa2d94a7f636136ba7279b965a18cf5b
2024-02-29osmo_io: Add osmo_io_get_ioops() functionHarald Welte2-0/+9
This function can be used by user code to obtain the currently-set io operations, it's the inverse of osmo_io_set_ioops(). Change-Id: I03398c811b9534f50c6644b21eea89a04be29fb0
2024-02-29osmo_io_poll: Declare local functions "static"Andreas Eversberg1-8/+8
Change-Id: I6ba88cd7bbd5b5ef42eb460679696f105c9158cb
2024-02-29osmo_io_uring: Detach msghdr from iofd before calling ↵Andreas Eversberg1-1/+9
iofd_handle_send_completion() msghdr must be detached, because subsequent callback at iofd_handle_send_completion() may destroy the iofd (which in turn frees this msghdr, if still attached) and frees the msghdr, causing a double free. Related: OS#5751 Change-Id: Ia349f73de2145fa360b20dd40deb73a8ffc71f07
2024-02-28osmo_io_uring: Cancel pending request, free msghdr on completionAndreas Eversberg1-4/+19
There is always a completion after cancelling a uring request. Because uring requests use msghdr pointer as user data, we cannot just free the msghdr after cancelling. Upon completion (received after cancelling), the user data still points to the msghdr. To prevent a use-after-free bug, msghdr is not freed, but detached from iofd instance. Then upon completion, the msghdr (if it was detached from iofd) is freed. Additionally it is not required to keep IOFD_FLAG_IN_CALLBACK set anymore, if there is a msghdr attached to iofd. As described above, all msghdr get detached, if iofd is freed (uring request get cancelled) during callback. Related: OS#5751 Change-Id: Ic253f085dd6362db85f029f46350951472210a02
2024-02-28osmo_io_poll: Use -errno as result on read errorAndreas Eversberg2-1/+2
Related: OS#5751 Change-Id: Ida63b74feecddf96bab7b2ade4e9ad216fe56e06
2024-02-28osmo_io: Reject writing messages with length of 0Andreas Eversberg1-0/+15
io_uring will reject to transmit messages with length of 0. Change-Id: I94be5ec7344d92157f7853c6c0ddf7007513ba8e Related: OS#5751
2024-02-28osmo_io: Use poll/select to notify socket connection at osmo_io_uring.cAndreas Eversberg2-1/+76
In order to receive a connect notification from SCTP socket, poll/select event must be used instead of a write notification via io_uring completion event. Once the connect notification has been received, subsequent write notifications via io_uring are used. Change-Id: I4eca9ea72beb0d6ea4d44cce81ed620033f07270 Related: OS#5751
2024-02-28osmo_io: sendmsg/recvmsg supportHarald Welte5-18/+155
Add support osmo_io operations resembling sendmsg() and recvmsg() socket operations. This is what will enable the implementation of higher-layer functions like equivalents of sctp_recvmsg() and sctp_send() in libosmo-netif and/or other users. Change-Id: I89eb519b22d21011d61a7855b2364bc3c295df82 Related: OS#5751
2024-02-28osmo_io: Move notify_connected function to backendAndreas Eversberg4-2/+29
This relocation is necessary as the backend (osmo_io_fd or osmo_io_uring) requires a different approach in handling connect notifications. As a result, a function call has been introduced to struct iofd_backend_ops. In a subsequent patch, the process for the osmo_io_uring backend will be modified to handle SCTP connect notifications using poll/select. If connect notification is requested using poll/select, the file descriptior must be registered to osmo_fd, using osmo_fd_register. If read / write notification is requested by application, the file descriptior must be registered also. A flag is used prevent calling osmo_fd_register / osmo_fd_unregister multiple times, which would cause a crash. Change-Id: I905ec85210570aff8addadfc9603335d04eb057a Related: OS#5751
2024-02-23osmo_io: Change struct osmo_io_ops to contain struct, not unionHarald Welte2-5/+43
As we introduce more modes, and each mode aliases call-back function pointers to those of another mode, we have more and more error cases where we (for exampele) access read_cb, but in reality the user has populated recvfrom_cb. Let's use a struct, meaning that call-backs of one mode no longer alias to the same memory locations of call-backs fro another mode. This allows us to properly check if the user actually provided the right callbacks for the given mode of the iofd. This breaks ABI, but luckily not API. So a simple recompile of higher-layer library + application code will work. Change-Id: I9d302df8d00369e7b30437a52deb205f75882be3
2024-02-23Make socket.c compile without libsctp support (--disable-libsctp)Andreas Eversberg1-0/+4
Change-Id: I214a16b60e0149a8b1cdcfd3c788cc56a1a40476
2024-01-30Prevent poll() in select.c to timeout too earlyAndreas Eversberg1-0/+9
Adjust osmo_timers_nearest_ms() to round up the remaining time. Note that poll() has a granularity of 1 millisecond. Previously, when rounding down the remaining time, osmo_select_main() would return too early, before the nearest timer timed out. Consequently, the main loop repeatedly called osmo_select_main() until the timer actually timed out, resulting in excessive CPU usage. By modifying osmo_timers_nearest_ms() to round up the remaining time, we ensure accurate timeout calculations, preventing unnecessary CPU consumption during the main loop. The patch only applies to non-embedded version of libosmocore, because the impact on embedded systems is not verified tested. Related: OS#6339 Change-Id: I79de77c79af4d50d1eb9ca0c5417123ff760dca3
2024-01-09Revert "logging: add log level cache"Hoernchen2-114/+0
This reverts commit 7dc6d4a629a37bb081d62f6ce61f4e5ee0237247. Reason for revert: other tests are failing Change-Id: Ife4c49d1bb933e983ac68c57970c9c49b40e08be
2024-01-09logging: add log level cacheEric2-0/+114
This ensures multithreaded logging attempts, in particular ones that do nothing, do not hold the lock just for checking the level, which interferes with other logging attempts. Closes: OS#5818 Change-Id: I35f8dd9127dd6e7feae392094fd6b3ce2d32558d
2024-01-09core: osmo_tdef_fsm_inst_state_chg(): allow millisecond precisionVadim Yanitskiy1-6/+17
This API predates commit 7b74551b9, which added support for millisecond granularity to osmo_fsm. Let's do the same for the tdef FSM wrapper API, allowing the millisecond precision without rounding-up to seconds. Of course, this patch changes behavior of the existing API, but having more precise state timeouts is not going to make the API user experience worse. The old behavior of using seconds is for kept for: * OSMO_TDEF_CUSTOM -- still treated as if it was OSMO_TDEF_S. * \param[in] default_timeout -- still expected to be in seconds. Change-Id: I4c4ee89e7e32e86f74cd215f5cbfa44ace5426c1 Related: 7b74551b9 "fsm: Allow millisecond granularity in osmo_fsm built-in timer"
2024-01-03bitvec: bitvec_to_string_r(): drop unused variableVadim Yanitskiy1-3/+1
bitvec.c:543:14: warning: variable 'pos' set but not used [-Wunused-but-set-variable] unsigned i, pos = 0; Change-Id: I17df6f9263bee06676309c00837f12220803c814
2024-01-03utils: osmo_bcd2str(): fix applying non-zero offset to null pointerVadim Yanitskiy1-1/+3
This can be seen when building with CC=clang: utils.c:150:22: runtime error: applying non-zero offset 100 to null pointer SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior utils.c:150:22 in utils.c:150:33: runtime error: addition of unsigned offset to 0x000000000064 overflowed to 0x000000000063 SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior utils.c:150:33 in The *dst pointer may be NULL (e.g. bcd2str_test() is passing it). This makes tests/utils/utils_test fail. Let's fix this. Change-Id: I542aef1ac220891b6bbdb0c60c39232f0df0a43c
2023-12-12socket: Introduce defines OSMO_SOCK_MULTIADDR_{PEER_STR,NAME}_MAXLENPau Espin Pedrol1-3/+3
These values end up being used by API users of osmo_sock_multiaddr_get_name_buf() and osmo_multiaddr_ip_and_port_snprintf(). Change-Id: I18a0e1a652a3e8ef3e97154355eb1d07a14ef0bd
2023-12-11soft_uart: fix the Rx flushing logic, add a unit testVadim Yanitskiy1-1/+1
Coverity tells us that with the current logic it's possible (in theory) that we may dereference NULL pointer in osmo_soft_uart_flush_rx(). This is highly unlikely, because the Rx buffer gets allocated once when the Rx is enabled and remains even after the Rx gets disabled. The Rx flags cannot be anything than 0x00 before the Rx gets enabled. Even though this NULL pointer dereference is unlikely, the Rx flushing logic is still not entirely correct. As can be seen from the unit test output, the Rx callback of the application may be called with an empty msgb if the following conditions are both met: a) the osmo_soft_uart_flush_rx() is invoked manually, and b) a parity and/or a framing error has occurred previously. We should not be checking suart->rx.flags in osmo_soft_uart_flush_rx(), since this is already done in suart_rx_ch(), which is calling it. Removing this check also eliminates a theoretical possibility of the NULL pointer dereference, so we're killing two birds with one stone. - Do not check suart->rx.flags in osmo_soft_uart_flush_rx(). - Add a unit test for various flush()ing scenarios. Change-Id: I5179f5fd2361e4e96ac9bf48e80b99e53a7e4712 Fixes: CID#336545
2023-12-11socket: Introduce API osmo_sock_sctp_get_peer_addr_info()pespin/multiaddrPau Espin Pedrol2-0/+78
This is a convenience helper to reetrieve the whole set of remote addresses and call getsockopt() on them, making it easy for users to analyse the full set of remote addresses of a socket simply providing an fd. Related: SYS#6636 Change-Id: I3e1c84526b006baff435bbbca49dc6cf7d201cf5
2023-12-11logging: fix NULL pointer dereference in _output_buf()Vadim Yanitskiy1-1/+1
In the _output_buf() we explicitly initialize only the 'buf' and 'len' fields of the struct osmo_strbuf, leaving the 'pos' field implicitly initialized to NULL. Later, in this function, 'sb.pos' is passed to ctime_r() and strlen(), leading to a NULL pointer dereference (segfault) in certain scenarios. This situation can occur when color logging is disabled or when a specific logging subsystem has no associated color. Any application using libosmocore's logging API would crash with the following config: log stderr logging filter all 1 logging timestamp 1 logging color 0 Fix this by initializing the 'pos' field explicitly. Change-Id: I7ec9badf525e03e54e10b725d820c636eaa3fd1c Fixes: d71331bc "logging: fix nul octets in log output / use osmo_strbuf" Fixes: CID#336550
2023-12-10socket: Fix uninitialized mem ptr free in osmo_sock_init2_multiaddr2()Pau Espin Pedrol1-1/+1
The goto tag was wrong, probably due to a copy-paste mistype while reimplementing the function. Closes: Coverity CID#336546 Change-Id: I06b810fde7bf750fcb42d6d9e6223883e26f5f0b
2023-12-10soft_uart: cosmetic: use consistent naming for the Rx buffer msgbVadim Yanitskiy1-1/+1
In osmo_soft_uart_flush_rx() we use "soft_uart_rx", so be consistent. Change-Id: Id637a39bab8ecd04bca5580bb48f965b501f5b2e
2023-12-09core: fix wrong logic in _osmo_it_q_dequeue()Vadim Yanitskiy1-7/+4
If the given queue is empty, queue->list.next points to &queue->list. Current implementation would call llist_del() on the queue's llist_head, decrement queue->current_length (which will be 0), and return a pointer to &queue->list to the caller. This is completely wrong. - Use the existing item_dequeue(), which does exactly what we need. - Do not decrement the current_length if nothing was dequeued. - Uncomment code in the unit test, we should not crash anymore. Change-Id: I63094df73b166b549616c869ad908e9f4f7d46d1 Fixes: CID#336557
2023-12-07socket: Introduce API osmo_sock_multiaddr_get_name_buf()Pau Espin Pedrol2-0/+108
An extra osmo_multiaddr_ip_and_port_snprintf() API is introduced which is used by osmo_sock_multiaddr_get_name_buf() but which will also be used by other app uers willing to use osmo_sock_multiaddr_get_ip_and_port() according to its needs (eg. only printing the local side). Related: SYS#6636 Change-Id: I48950754ed6f61ee5ffa04a447fab8903f10acc0
2023-12-07socket: Introduce API osmo_sock_multiaddr_get_ip_and_port()Pau Espin Pedrol2-0/+90
This API will be used internally by osmo_sock_multiaddr_get_name_buf() in a follow-up patch. This API can also be used directly by user who wish to obtain a list of local/remote IP addresses and port from an SCTP socket. Related: SYS#6636 Related: OS#5581 Change-Id: I19d560ab4aadec18a4c0f94115675ec1d7ab14d7
2023-12-07logging: fix nul octets in log output / use osmo_strbufNeels Hofmeyr1-84/+44
Patch [1] merged few weeks ago, for yet unknown reasons, sprinkles nul characters at seemingly randomly chosen log line ends. Trying to figure out why that happens, i got tired of the unreadable cruft, and decided to migrate the _output_buf() implementation to osmo_strbuf first. With osmo_strbuf in use and implementing 1:1 what the previous code did, the odd nul octets have disappeared. So the bug was caused by unreadable code. [1] 11a416827dd9f2da6b7c1db0e1e83adb1e6e5cc8 Ia7de9d88aa5ac48ec0d5c1a931a89d21c02c5433 "logging: ensure ANSI color escape is sent in same line/before newline" Related: OS#6284 Related: Ia7de9d88aa5ac48ec0d5c1a931a89d21c02c5433 Change-Id: Ib577a5e0d7450ce93ff21f37ba3262704cbf4752
2023-12-07util: add osmo_strbuf macros to manipulate the strbuf tailNeels Hofmeyr2-0/+47
Upcoming patch adopts osmo_strbuf in logging.c, which sometimes needs to steal and re-add trailing newline characters, and also needs to let ctime_r() write to the buffer before updating the osmo_strbuf state. Related: OS#6284 Related: Ib577a5e0d7450ce93ff21f37ba3262704cbf4752 Change-Id: I997707c328eab3ffa00a78fdb9a0a2cbe18404b4
2023-12-06socket: osmo_sock_init2_multiaddr2(): Apply params too if no ↵Pau Espin Pedrol1-19/+21
OSMO_SOCK_F_BIND flag set Those parameters are not related to binding and hence should be applicable before binding. This allows a caller setting them while not caring about explicit binding (OSMO_SOCK_F_BIND). Until recently calling this function without OSMO_SOCK_F_BIND was not really supported, so the previous placement setting these params in the function didn't matter much. It does now. Change-Id: Ia32510e8db1de0cc0dc36cebf8a94f09e44fda70
2023-12-06socket: Reimplement osmo_sock_init2_multiaddr()Pau Espin Pedrol1-44/+103
This is an attempt to fix several downsides of current osmo_sock_init2_multiaddr() API, mainly the requirement to pass an explicit local address (!NULL). It also now works fine if OSMO_SOCK_F_BIND flag is not used. This reimplementation is based on the follwing logic: - If caller passed family=AF_INET or family=AF_INET6, that same family is used and kernel will fail if something is wrong. - If caller passes family=AF_UNSPEC, the function will try to find the required family to create the socket. The decision is taken on the assumption that an AF_INET6 socket can handle both AF_INET6 and AF_INET addresses (through v4v6 mapping). Hence, if any of the addresses in the local or remote set of addresses resolves through getaddrinfo() to an IPv6 address, then AF_INET6 is used; AF_INET is used otherwise. Related: OS#6279 Change-Id: I2641fbaca6f477404b094dbc53c0c1a3dd3fd2fd
2023-12-04soft_uart: implement modem status lines and flow controlVadim Yanitskiy2-6/+75
Change-Id: I26b93ce76f2f6b6fbf017f2684312007db3c6d48 Related: OS#4396
2023-12-04soft_uart: osmo_soft_uart_tx_ubits(): return number of bits pulledVadim Yanitskiy1-2/+2
This is a partial revert of 0887188c6b133b69142965d65e1be8a0696a6272. We actually want to return number of bits pulled, because in the upcoming commit implementing the flow control we want to be able to signal to the caller that the buffer was not completely filled, but only partly. Change-Id: I47a56f0fc36f2bc8f5a797d7fec64dfb56842388 Related: OS#4396
2023-12-04soft_uart: cosmetic: do not use 'osmo_' prefix for static symbolsVadim Yanitskiy1-4/+4
Change-Id: I2b450b715dbfd0f8d6ddb4994ae0be3b890ed4fc Related: OS#4396
2023-12-03soft_uart: check Rx/Tx state once in osmo_soft_uart_{rx,tx}_ubits()Vadim Yanitskiy1-8/+9
Check it once rather than doing this in a loop. Return -EAGAIN if Rx or Tx is not enabled when calling osmo_soft_uart_{rx,tx}_ubits(). This [theoretically] improves performance by reducing the number of conditional statements in loops. In the Tx path, this also prevents calling the .tx_cb() when the transmitter is disabled, so that we don't loose the application data. Change-Id: I70f93b3655eb21c2323e451052c40cd305c016c8 Related: OS#4396
2023-12-03soft_uart: fix doxygen doc for osmo_soft_uart_tx_ubits()Vadim Yanitskiy1-1/+1
Change-Id: I648db45bbde39c6b3d839c744a56d01a562e4129 Related: OS#4396
2023-12-03soft_uart: add osmo_soft_uart_{get,set}_name()Vadim Yanitskiy2-0/+18
Change-Id: Iabf29f42d876035481011fa8e8a51c0590fe63b8 Related: OS#4396