aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)AuthorFilesLines
2024-02-23debugjolly/workAndreas Eversberg4-9/+71
Change-Id: Ic21d1617ec4d8251ae87ad9abaacde67f3738748
2024-02-23Make osmo-io compile without libsctp support (--disable-libsctp)Andreas Eversberg4-2/+15
Change-Id: Ief8ca40c0e85efe340eaecb866a10f76ac2bfc98
2024-02-23Make socket.c compile without libsctp support (--disable-libsctp)Andreas Eversberg1-0/+4
Change-Id: I214a16b60e0149a8b1cdcfd3c788cc56a1a40476
2024-02-23osmo_io_uring: Run check of tests/osmo_io with io_uring alsoAndreas Eversberg2-2/+10
Related: OS#5751 Change-Id: I82db9a15bc483a5447d86352512afaafa2bcfbb6
2024-02-23osmo_io_poll: Declare local functions "static"Andreas Eversberg1-8/+8
Change-Id: I6ba88cd7bbd5b5ef42eb460679696f105c9158cb
2024-02-23osmo_io_uring: Detach msghdr from iofd before calling ↵Andreas Eversberg1-1/+7
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-23osmo_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-23osmo_io_poll: Use -errno as result on read errorAndreas Eversberg2-1/+2
Related: OS#5751 Change-Id: Ida63b74feecddf96bab7b2ade4e9ad216fe56e06
2024-02-23osmo_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-23osmo_io: Use poll/select to notify socket connection at osmo_io_uring.cAndreas Eversberg2-1/+66
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-23osmo_io: SCTP supportHarald Welte6-8/+128
Add support osmo_io operations resembling sctp_send() and sctp_recvmsg() that is provided by libsctp of lk-sctp. Change-Id: I89eb519b22d21011d61a7855b2364bc3c295df82 Related: OS#5751
2024-02-22osmo_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-12cosmetic: tests/gsup/gsup_test: Move send_e_send_end_signal_res to correct placePau Espin Pedrol1-10/+10
All the different procedures are placed in order, except this one. Change-Id: If0877deca2bcbf40229c9c61f471112f1e8cdb0e
2024-02-06comment: gsm_04_08.h: add a spec hintNeels Hofmeyr1-1/+2
Change-Id: I2a606047db88ea47317397a790611048dead6403
2024-01-31coding: fix wrong n_bits_total reported for PDTCH CS2 and CS3Vadim Yanitskiy2-7/+16
In gsm0503_pdtch_decode(), we decode CS2 and CS3 as if no puncturing was employed, reordering the coded bits and setting punctured ones to 0 manually. Because of that, osmo_conv_decode_ber_punctured() reports n_bits_total higher than we actually receive over the air. Change-Id: I6b20cc450f25c48175a61da02644d66c08e22ece Related: OS#6342, OS#6200
2024-01-31coding: fix artificial bit errors for PDTCH CS2 and CS3Vadim Yanitskiy2-8/+11
GPRS coding schemes CS2 and CS3 (defined in 3GPP TS 45.003 sections 5.1.2 and 5.1.3, respectively) employ so-called puncturing, which can be described as intentional removal of coded bits. The goal of puncturing is to reduce the number of coded bits, so that they fit into 4 bursts. The receiving side recovers punctured bits, as if they were received corrupted. The puncturing is also used for other channel types like TCH/F9.6, TCH/F14.4, TCH/AFS and TCH/AHS, but only for CS2 and CS3 we're doing puncturing/depuncturing *manually*. This explains why we're seeing artificial bit errors only for CS2 and CS3. gsm0503_pdtch_decode() should not be reporting punctured bits as bit errors, fix this by using osmo_conv_decode_ber_punctured(). Change-Id: I024276d167e769396187998d881f8e7626461249 Related: OS#6342, OS#6200
2024-01-31coding: improve readability in osmo_conv_decode_ber_punctured()Vadim Yanitskiy1-6/+10
Change-Id: Iaece6d0fe42f173187baa5c87fcbe3cfc60c21fc Related: OS#6342, OS#6200
2024-01-31coding: fix a typo in docs for gsm0503_pdtch_decode()Vadim Yanitskiy1-1/+1
Change-Id: I72e7dab116229d908add3896ecb47b59e3001f1b
2024-01-31utils/conv_codes_gsm.py: fix inconsistent formattingVadim Yanitskiy1-2/+2
Change-Id: Ida99f0fe149b234c738875527dd64b610d33e050
2024-01-30ctrl: Add lchan nodeMatan Perelman1-0/+1
Change-Id: Ibf2786f668ee7e4f5b6a9ef43f2141cd2d79b4e2
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-29tests/Makefile.am: do not add files to EXTRA_DIST conditionallyVadim Yanitskiy1-1/+1
These files must be present in the release tarballs regardless of the configure options (ENABLE_LIBSCTP, ENABLE_SCTP_TESTS). Change-Id: I8f530d6157b00907dd1b438100bb0fb300dfcd22 Related: OS#6349
2024-01-28osmo-release.sh: make it a bit more user friendlyVadim Yanitskiy1-1/+3
Change-Id: I8574cb00de820ab477eb5c4abd05d8e546ca89cc
2024-01-26tests/sockaddr_str: rc_name(): also handle -EAFNOSUPPORTVadim Yanitskiy2-39/+41
Change-Id: I489378705e19c6b09f2fa894ddea4b8a0dc0c7e4
2024-01-26tests/sockaddr_str: fix dead code, print some errno valuesVadim Yanitskiy2-87/+82
This fixes a -Wunused-function warning thrown by clang. Change-Id: I45e9044f80e1f634c811e729f4314ec9bcf6a9ad
2024-01-25tests/a5: fix bit-wise vs logical and in test_a5[34]()Vadim Yanitskiy1-2/+2
This fixes a -Wbitwise-instead-of-logical warning thrown by clang. Change-Id: I6ae0d13882ab7a6b1ca35ccd7f9a5e1d9cac911d
2024-01-25tests/iuup: fix duplicate assignment in def_configure_reqVadim Yanitskiy1-1/+0
This fixes a -Winitializer-overrides warning thrown by clang. Change-Id: Id29237d212a05dec1c57bbfd53d9cb7e71ca0991
2024-01-25gsm: add more definitions from Table 10.5.112/3GPP TS 24.008Vadim Yanitskiy1-0/+22
Change-Id: I25e40853ace09fa98b614f3893eeba600be8fcdc Related: OS#4396
2024-01-25isdn/v110_ta: avoid redundant .status_update_cb() callsVadim Yanitskiy2-36/+31
Let's be smarter and call the status update callback iff the V.24 flagmask was actually changed. Change-Id: I9626d3e737d4e072fa163115c4cdf9ee6ee0968e Related: OS#4396
2024-01-22tests/gsm0408: add two more samples to bcap_tests[]Vadim Yanitskiy3-0/+53
The mismatch for bcap_csd_2400_v22bis is expected, because octet 4 is not represented in 'struct gsm_mncc_bearer_cap' and the encoder unconditionally hard-codes it to 0x88. Change-Id: I4fc519c02b4fad8b0f40fa649d9de14b1183d10d Related: OS#4396, OS#4394
2024-01-22tests/gsm0408: cosmetic: adjust coding style (make linter happy)Vadim Yanitskiy1-23/+23
Change-Id: I203033e2b3c27cb8b258faf1ff3c5ec4c0083458
2024-01-20gsup: Convert PDP-Type IE to PDP-Address IEPau Espin Pedrol6-15/+110
The previous PDP-Type IE should have been a PDP-Address from the start, since having only PDP-Type with no address is only a specific case (dynamic addressing). This becomes clear by looking at other similar protocols like: * MAP: APN-Configuration IE has servedPartyIP-IP{v4,v6}-Address IEs * Diameter S6b, 3GPP TS 29.272 7.3.35 APN-Configuration contains Served-Party-IP-Address AVPs * Diameter SWx, 3GPP TS 29.273 APN-Configuration. * GTPv1C Ts 29.060 7.7.29 PDP Context containing PDP Address. Since PDP-Type on its own really makes no sense, being it a special case of PDP-Address, let's keep the IE by renaming it (keeping old name too for API backward compat) and extend it to support lengths > 2 bytes. Old implementation of libosmogsm gsup actually ignored lengths > 2 bytes, so we are safe acting against older implementations here, both on the sending and receiving side on the wire. The big drawback of this commit is that it breaks ABI compatibility due to adding "struct osmo_sockaddr pdp_address[2];" to struct osmo_gsup_pdp_info, which in turn affects shift of fields in struct osmo_gsup_message. Unfortunately, there's not much that can be done to improve the situation when adding the missing field, due to existing API having the same struct for all messages. Ideally we'd have 1 union with structs per message type inside, this way the ABI break would be far less pronounced. The GSUP test output change is becaue we now accept some of the len>2 cases for PDP-Type/Address IE which were being rejected since a couple commits ago. libosmogsm gsup code is now disabled in EMBEDDED mode, since it nows depends on core/socket.h (struct osmo_sockaddr) which is not available in EMBEDDED, and hence fails during build: """ In file included from /build/include/osmocom/gsm/gsup.h:45, from /build/src/gsm/gsup_sms.c:28: /build/include/osmocom/core/socket.h:15:10: fatal error: arpa/inet.h: No such file or directory 15 | #include <arpa/inet.h> | ^~~~~~~~~~~~~ """ Related: OS#6091 Change-Id: I775ff9c3be165d9f30d6ab55d03f99b6104eadd6
2024-01-20gsup: Deprecate field pdp_type in favour of pdp_type_nr and pdp_type_orgPau Espin Pedrol3-7/+25
Having both fields in an uin16_t integer makes it difficult and confusing for users for no good reason. Let's have separate fields for each of them. The new fields are defined so that they are ABI compatible with previous uin16 field. Change-Id: Ie31c6080c90e468c01186259f2c42621e39b5cc6
2024-01-20gsup: Fail decoding if len of PDP Type IE is less than 2 bytesPau Espin Pedrol2-1/+3
As documented in gsup.adoc, this field is expected to be 2 bytes. This is only a intermediate step to showcase the related test scenarios submitting IE with len > 2. The logic will be changed in a follow-up patch when changing the IE to also encode/decode the missing Address part. Change-Id: I0d024a9a4fb10beeff39ac33a9d2ed02f88f4580
2024-01-20gsm_04_08_gprs.h: Introduce packed struct gsm48_pdp_addressPau Espin Pedrol1-1/+35
This can be used in several protocols, such as GTP, GSUP, etc. Related: OS#6091 Change-Id: I453ced42dd36df3a6ddb5db67093df5a22cad18c
2024-01-18cosmetic: gsup.h: fix whitespace formattingPau Espin Pedrol1-1/+1
Change-Id: Icd5e38db1b99889ad15a2a4cbb83393292a54180
2024-01-16isdn: add a lookup table with E1/E2/E3 bits from Table 5/V.110Vadim Yanitskiy3-27/+42
Let's make those E1/E2/E3 bit combinations publicly available in form of a lookup table (key is enum osmo_v100_sync_ra1_rate). Add convenience macros for setting and comparing these bits. This lookup table will be used by osmocom-bb.git. Change-Id: I6d2f8e250df31c233a2741163113dc07515409ae Related: OS#4396
2024-01-09Revert "logging: add log level cache"Hoernchen5-123/+2
This reverts commit 7dc6d4a629a37bb081d62f6ce61f4e5ee0237247. Reason for revert: other tests are failing Change-Id: Ife4c49d1bb933e983ac68c57970c9c49b40e08be
2024-01-09logging: add log level cacheEric5-2/+123
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-09isdn: initial implementation of the V.110 TAVadim Yanitskiy10-1/+1758
ITU-T recommendation V.110 defines Terminal Adaptor (TA) functions for the connection of Terminal Equipment (TE) having standard V-series interfaces to the ISDN. This patch brings "software" implementation of the TA to libosmoisdn. The primary user for this soft-TA is the mobile-side implementation of CSD (Circuit Switched Data) in osmocom-bb. CSD is heavily based on V.110, which is not surprising given that GSM is a "wireless ISDN". Nevertheless, this code will likely also be useful in the context of retro-networking. Similarly to the existing V.110 code in libosmoisdn, the present implementation aims to be functional and correct, rather than efficient in any way. It also has several limitations, which are not critical for the CSD use case, but eventually may be a problem for other use cases in the context of retro-networking. Therefore, the V.110 TA API should be considered _unstable_, and may be subject to change in the future. +-------+ +------+ B-channel +------+ +-------+ | TE1 |------| TA |~~~~~~~~~~~~~~~| TA |------| TE2 | +-------+ +------+ +------+ +-------+ TE (also known as DTE) is basically a computer, having a V-series (usually RS-232) connection to TA (also known as DCE). The TA acts like a regular analog modem, except that it is not performing any kind of modulation or demodulation itself. The TE-TA interface is implemented by the user supplied callback functions, configured during the allocation of a TA instance: * .rx_cb() - receive call-back of the application, * .tx_cb() - transmit call-back of the application, * .status_update_cb() - status line update call-back. In addition to that, the application (TE) can interact with the V.24 status lines (circuits) using the following API: * osmo_v110_ta_{get,set}_status(), * osmo_v110_ta_{get,set}_circuit(). The Rx and Tx between TE and TA is always driven by the TA itself, as a result of an interaction with the lower layer implementing the B-channel interface. There is currently no buffering and thus no way for TE to initiate transmission or pull data on its own. The TA-TA (B-channel) interface is implemented by the following functions, which are meant to be called by the lower layer transmitting and receiving V.110 frames over certain medium: * osmo_v110_ta_frame_in() - indicate a received V.110 frame, * osmo_v110_ta_frame_out() - pull a V.110 frame for transmission, * osmo_v110_ta_[de]sync_ind() - indicate a synchronization event. The lower layer is responsible for finding the synchronization pattern (if needed), aligning to the frame boundaries, and doing the V.110 frame coding. The D-channel signalling is behind the scope of this module. Initial (Work-in-Progress) implementation by Harald Welte, completed and co-authored by Vadim Yanitskiy. Change-Id: I5716bd6fd0201ee7a7a29e72f775972cd374082f Related: OS#4396
2024-01-09fsm: fix OSMO_T_FMT_ARGS: add missing bracesVadim Yanitskiy1-1/+1
Change-Id: I3ea7cbc8a51d310d9929ca5a805eb1d3d3880793
2024-01-09tests/tdef: improve test output (use OSMO_T_FMT[_ARGS])Vadim Yanitskiy2-15/+16
Change-Id: Ie216bcf93b96610c46c6e616835a6793772e2baa Related: e30d22a0 "tests/tdef: also test OSMO_TDEF_US and negative T values"
2024-01-09core: osmo_tdef_fsm_inst_state_chg(): allow millisecond precisionVadim Yanitskiy5-19/+34
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-08gsm: fix osmo_mobile_identity_decode(): init *mi on errorVadim Yanitskiy1-2/+4
Change-Id: I1c1503120c6c0e5479d8350fe762470bdb6266b8
2024-01-07gsm48_ie: fix various issues in doxygen docsVadim Yanitskiy1-7/+8
Change-Id: Id168c5115588b2dbc48605ee0bba13ccc9913bbe
2024-01-05vty: suppress warnings about len being set but not usedVadim Yanitskiy1-0/+1
This commit fixes the following warning seen with CC=clang: utils.c:376:6: warning: variable 'len' set but not used [-Wunused-but-set-variable] int len = 0, offset = 0, ret, rem; ... and finally allows to build libosmocore with --enable-werror. Change-Id: I0040ef20ba3fc53ee7ccefc4885170f333f80566
2024-01-05gsm0808_utils: use osmo_strbuf API, drop APPEND_{THING,STR,CELL_ID_U}Vadim Yanitskiy1-31/+16
This code predates 2cbe25f4, adding osmo_strbuf API and so using its own append-to-strbuf implementation. Let's use the new generic API. Change-Id: Ifdfd18eeef6a0932995063259f9f179b22e781de
2024-01-04ecu: fix alignment of fr_ecu_statePhilipp Maier1-13/+13
The member data[0] in struct osmo_ecu_state is used as an anchor to attach private structs for a concrete ECU implementation. This works by allocating more memory then struct osmo_ecu_state actually needs and then using the excess memory to store the private struct of the concrete ECU implementation. However, this poses a problem since data[0] is at the end of the struct it may land in an unaligned position. This also means that the struct we store there is also unaligned. We should fix this enclosing the public struct osmo_ecu_state into our private struct fr_ecu_state. Then we can use container_of to cast from osmo_ecu_state to fr_ecu_state and correct alignment is ensured as well. Related: OS#6286 Change-Id: I28672856e8e8f47e04ffe09ee3e07b577108cdc7
2024-01-03pseudotalloc: add talloc_memdup(), use it in talloc_strdup()Vadim Yanitskiy2-12/+13
Change-Id: Ifcf377c3496a9e75404932a1aaba7d74888cf4cf
2024-01-03tests/tdef: tune logging, also match stderrVadim Yanitskiy4-2/+37
Change-Id: I7f346dfbec9e724e905d26990a978495d3a9b030