Commit Graph

567 Commits

Author SHA1 Message Date
Harald Welte 8857f3b798 Add osmo_io with initial poll backend
* make backend configurable for later
* segmentation callback for chunked streams
* logging target for osmo_io
* support partial writes

Change-Id: I50d73cf550d6ce8154bf827bf47408131cf5b0a0
Related: SYS#5094, OS#5751
2023-05-10 06:04:57 +00:00
Vadim Yanitskiy 37dc995234 core: remove unnecessary #include <osmocom/core/talloc.h>
Including this header just for TALLOC_CTX is an overkill, we use
'void *' for talloc contexts in nearly all other Osmocom projects.

Change-Id: I4b9ffd7a329081df3d2c0b0ee8698a3cf759e94e
Related: OS#5960
2023-03-31 05:39:24 +07:00
Harald Welte 8969298a77 rate_ctr: Add rate_ctr_add2() similar to rate_ctr_inc2()
The convenience wrapper relieves the caller from manually resolving
the individual counter, and instead specify just the counter group
and the index.

Change-Id: If93e8b4fb0b86a87358f32d2b45438ca1887e9f3
2023-03-24 14:08:08 +01:00
Harald Welte 5e3aaf9f0d gsmtap.h: Define a packet type for encapsulation of GSM RLP frames
This allows us to feed RLP frames (occurring in GSM CSD) into wireshark
for dissection.

Change-Id: Ibb7f0731c31e5a5cd2911f733da5510ce0f3a1d6
2023-03-24 13:07:58 +00:00
Eric Wild 8c505c12b2 logging: remove log_initialized(void)
This function does not exist, and was apparently accidentally added (?)
to the header.

Change-Id: I479ef8484506ff27918df9fbf6cbeda8b304bbaa
2023-03-07 14:27:59 +01:00
Daniel Willmann 45ae1c5400 Add osmo_sockaddr_size() to return the size of the variant used
Change-Id: I952b6bb752441fe019fc18f89bce4bbfbe58994a
2023-03-02 09:47:41 +00:00
Vadim Yanitskiy 22ade291ad msgb: use OSMO_ASSERT in msgb_alloc_headroom[_c]()
This patch is a preparation for the upcoming change making use of
the built-in static_assert(), which is available since C11.

When using built-in static_assert(), gcc v12.2.1 fails:

include/osmocom/core/msgb.h: In function 'msgb_alloc_headroom_c':
include/osmocom/core/msgb.h:532:33: error: expression in static assertion is not constant
  532 |         osmo_static_assert(size >= headroom, headroom_bigger);
include/osmocom/core/utils.h:86:24: note: in definition of macro 'osmo_static_assert'
   86 |         static_assert((exp), "(" #exp ") failed")
      |                        ^~~
include/osmocom/core/msgb.h: In function 'msgb_alloc_headroom':
include/osmocom/core/msgb.h:554:33: error: expression in static assertion is not constant
  554 |         osmo_static_assert(size >= headroom, headroom_bigger);
include/osmocom/core/utils.h:86:24: note: in definition of macro 'osmo_static_assert'
   86 |         static_assert((exp), "(" #exp ") failed")
      |                        ^~~

These are not really *static* assert()s, because they operate on the
user supplied arguments 'size' and 'headroom', which are not guaranteed
to be integer literals.  Neither they trigger compilation failures
as expected, nor do they abort at run-time.  They simply do nothing.

Change-Id: I17ef4f3283ce20a5b452b7874c826acfb02a0123
2023-02-27 09:58:46 +00:00
Neels Hofmeyr ba1e20055f add osmo_prim_operation_name()
Also remove the explicit array dimension from the .h file.

Change-Id: I9f43428af654a5674ac3035fe4db1394aac7a7af
2023-02-22 16:45:14 +00:00
Max a747d36166 GSMTAP: add gsmtap_source_init*2()
Those allow selecting source host:port for UDP socket sending GSMTAP data.
It's handy when you have several GSMTAP sources operating simultaneously.

Change-Id: I51b3604ba79e42c474aa17007e7e308a12afcea8
2023-02-20 11:03:05 +00:00
Oliver Smith 0b5c09b3f0 Fix typo endianess -> endianness
Rename contrib/struct_endianess.py to contrib/struct_endianness.py, and
fix the typo everywhere. This is in preparation to call the script in
CI on all repositories.

Related: OS#5884
Change-Id: Idc4af9098ba1de26243464c772d6ea8be330646a
2023-02-17 10:37:40 +01:00
Pau Espin 51e9dde95e Introduce tundev API
The data structre is held private so that it can be easily extended in
the future.

Change-Id: I6f8324da9ba49b9249682e2ec5b45297f18dd8c2
2023-01-25 16:08:35 +01:00
Pau Espin 9d0321d041 Introduce netdev API
This module provides several operations on network devices
(interfaces), like monitoring changes, setting addresses, routes, link
state, etc.
It also supports managing network interfaces on several different netns
concurrently.

These functionalitites will be used by the tun module included in a
follow-up patch.

Change-Id: I7a00c0445a89e088676a4897061b65196d9197f1
2023-01-25 16:06:55 +01:00
Pau Espin 8a5014be08 Introduce netns API
Write a new API and implementation to manage network namespace related
operations.

This will be used by the upcoming tundev module.

Change-Id: I0f2fba2fa42250a07211a7b7f479498f27c529da
2023-01-24 12:38:20 +01:00
Pau Espin 4fc6118bb3 Split include/Makefile.am content into subdirs
When someone is modifying a given library there's no need to be looking
at a common file contains tons of lines from different libraries.
Furthermore, this removes the need of "nobase" autofoo prefix, hence
following the usual directive of having one Makefile per directory.

Change-Id: I785891c2f89114bf8303c799094b637d3d25ac71
2023-01-18 18:29:34 +01:00
Pau Espin cc296c9293 socket.h: Introduce API osmo_sockaddr_netmask_to_prefixlen()
Implementation is imported from osmo-ggsn.git
97f60e3dca581797007524e0006ca9fafad59713 in46a_netmasklen() and adapter
to work with an osmo_sockaddr.

This will be used by osmocom-bb's "modem" app.

Change-Id: I75e75e251c6776801fffdde745aebedf21c68799
2023-01-17 10:53:09 +01:00
Philipp Maier 94705d042a uitils: add floored and euclidian modulo functions
C/C++ only implements a so called "truncated modulo" function. Lets also
add a floored and an euclidian modulo function to be more complete.

The functions will be used to generalize the following Change:
I5fb2b0ada8d409730ac22963741fb4ab0026abdd

Change-Id: If61cd54f43643325c45f64531c57fe4c5802a9cf
2023-01-12 09:33:07 +00:00
Harald Welte d7d4b1b7d0 gsmtap.h: Add definitions for various ISDN sub-types
We've started to encapsulate a varieth of ISDN related formats
as sub-types to GSMTAP_TYPE_E1T1 for quite some time.  Let's add
some more formats, such as V5EF, V.110, V.120, X.75 and H.221

For the HDLC based V5EF, V.110, V.120 and X.75 the payload format is
clear.  For V.110 and H.221 we will need to specify how the actual
payload looks like.

Change-Id: I8dee0f730cf91d6f9133d5c57f653e669ec8d598
2022-12-02 17:05:50 +01:00
Harald Welte e61d459cef Support building with -Werror=strict-prototypes / -Werror=old-style-definition
Unfortunately "-std=c99" is not sufficient to make gcc ignore code that
uses constructs of earlier C standards, which were abandoned in C99.

See https://lwn.net/ml/fedora-devel/Y1kvF35WozzGBpc8@redhat.com/ for
some related discussion.

Change-Id: I84fd99442d0cc400fa562fa33623c142649230e2
2022-11-03 12:44:28 +01:00
Max df5b1e17a5 msgb: introduce extended copy functions
Those are similar to existing *msgb_alloc*() functions but allows
to change the size of destination msgb provided it fits the
data from source msgb.

Change-Id: I36d4c16241d19f0f73c325be4d0e0bdef6813615
Signed-off-by: Max <msuraev@sysmocom.de>
2022-10-25 08:51:22 +00:00
Harald Welte d98a867743 logging.h: Allocate DLM2PA and DLM2UA for libosmo-sigtran
Change-Id: I106b7586bfe8ee03c052b6f8b33da4c466e05abd
2022-10-16 17:14:08 +02:00
Philipp Maier 724c1625e2 msgb: do not use msgb_l4 instead of msgb_sms
The macro msgb_sms() is basically an alias for msgb_l4(). Lets use
msgb_l4() in msgb_l4len() instead of msgb_sms().

Change-Id: I90d4f5c07fbaadd9e022752a2c64c4855f0b4227
2022-10-06 07:52:09 +00:00
Philipp Maier d9d62102cc msgb: assert msgb->lXh to be not NULL
When any of l1h, l2h, l2h or l4h is set to NULL (which is the default
for newly allocated message buffers). Then the msgb_lXhlen() functions
will return the address value of msgb->tail. This can lead to unexpected
results at a later point. We should have an OSMO_ASSERT to catch the
problem early.

Change-Id: I1795c559f190713ebbabfbabf3453ab77da46a49
Related: OS#5645
2022-10-06 07:52:09 +00:00
Pau Espin 3b3955b203 socket: Introduce API osmo_sockaddr_is_any
Change-Id: I2810a889fc14052d0e0be6a2b500ad4e5088ffa9
2022-10-04 16:30:32 +02:00
Pau Espin 3c12f557bd socket.h: Reorder sockaddr APIs to have them all together
Change-Id: Iab2ee2854be8027ee5978e06a83248b530a39bf7
2022-10-04 12:31:03 +02:00
Vadim Yanitskiy 395db204b4 include: use '#pragma once' everywhere
Change-Id: Iecc1754caae401aca28444d3e3d0cca04b398f26
2022-09-29 05:44:09 +00:00
Pau Espin 812766e231 utils.h: protect param with parenthesis in OSMO_BYTES_FOR_BITS()
While at it, drop 8-1 in favour of 7. I don't think it is really more
understandable for readers to see some subtraction there...

Change-Id: I8b21eba9b9aa952f86abe7a6d4cdb1d1a61d9deb
2022-09-08 15:03:44 +02:00
Neels Hofmeyr 709da278ca Revert "Add function to guess AF_UNSPEC address"
This reverts commit a4063efa7d.

Reason for revert: It is not possible to guess the IP address
family from uninitialized memory. This function simply glorifies
random noise into an IPv6 address. It makes no sense to have it.

Change-Id: Ifadd614604cf9d0c2ed1a405493c1c3fcb37ae23
2022-08-17 14:05:18 +00:00
Neels Hofmeyr 9e4c2ebf18 Revert "Add osmo_sockaddr_strs_to_str()"
This reverts commit e145e28a91.

Reason for revert:
The function osmo_sockaddr_strs_to_str() should not be part of the
osmo_sockaddr_str API. The implementation of this should live in
the function multiaddr_snprintf() added in patch
Icef53fe4b6e51563d97a1bc48001d67679b3b6e9
and should not use dynamic allocation.

Change-Id: I263dfd68313b896c5b474025fbca13c22ce41cdc
2022-08-17 01:01:16 +00:00
Max e145e28a91 Add osmo_sockaddr_strs_to_str()
This will come in handy for working with multihomes sockets like SCTP.

Related: OS#5581
Change-Id: Ic0d7c08f669994e37a2314555ecac85d28c42c89
2022-08-14 12:21:12 +07:00
Max a4063efa7d Add function to guess AF_UNSPEC address
Sometimes we receive generic "struct sockaddr" with unspecified (AF_UNSPEC)
address family. It's handy to try to guess
the proper address (there're just 2 variants ATM in most practical applications).

Use the added function to relax input checks in osmo_sockaddr_str_from_in*()

Related: OS#5581
Change-Id: I1c90c56ce832f53b65e0d18d3cea94621c02a69a
2022-08-09 08:58:49 +00:00
Vadim Yanitskiy 8137d9a0f0 logging: add a new category DLCSN1 for libosmo-csn1
This new category is going to be used by CSN.1 codec in libosmo-csn1.

Change-Id: Ie8c0effb764547a0f9cc8c6825e11a6617501e95
2022-08-04 02:32:13 +07:00
Vadim Yanitskiy b3e3a5d215 fsm: osmo_fsm_{event,inst,state}_name(): make *fi pointer const
Change-Id: I98cde213deb5a3bf39eb9f5e5451f40223632844
2022-07-29 00:06:48 +07:00
Harald Welte 1e1436ce75 stats: Functions with no arguments should specify(void)
... otherwise callers might pass arbitrary arguments without raising
a compiler error or warning.

Change-Id: Ia2de1d13df5f00dcc42493090734a635029d76b5
2022-05-08 09:57:04 +02:00
Pau Espin 9d3cfeff3e cosmetic: logging.h: fix indentation
Change-Id: Ia7f43e061275da1a8233f90df173d1ae18691964
2022-04-28 14:53:21 +00:00
Oliver Smith 5e24eea15c Cosmetic: linuxlist.h: fix misleading comment
Whenever iterating over a list and removing entries,
llist_for_each_entry_safe must be used instead of llist_for_each_entry.

The comment with "non-consecutive(!)" entries sounds like this is not
needed as long as one is iterating over the list consecutively. I guess
that might have worked with prefetch logic, however the prefetch
function is just a stub in linuxlist.h. (Also prefetch has been removed
from list.h in linux.git e66eed651fd18a961f11cda62f3b5286c8cc4f9f.)

Change-Id: I217e6871afe121edba26e4c6fd1a461e397c9e72
2022-03-13 21:36:27 +00:00
Neels Hofmeyr 9c7f7f85c8 add osmo_sockaddr_set_port()
Do it like osmo_sockaddr_port() in reverse.

Related: SYS#5599
Change-Id: I9512e44c3203daebb3fe3435fceef167613c1a73
2022-03-01 16:33:40 +00:00
Vadim Yanitskiy c797e25f3e core/utils.h: make use of OSMO_LIKELY in OSMO_ASSERT
Theoretically, this should improve performance of the code where
we frequently invoke OSMO_ASSERT(), like osmo-msc and osmo-bsc.

Change-Id: I29b32a2477ec92762f8f0ce5e5c5a30810f6abbe
2022-02-09 10:05:25 +00:00
Vadim Yanitskiy 85c7831b65 core/msgb.h: make use of OSMO_LIKELY / OSMO_UNLIKELY
Change-Id: Iff666b5fa0b320ae47b6c8c5dfd39debd2d9b8b7
2022-02-08 19:48:52 +00:00
Vadim Yanitskiy 9ac355ad51 core/utils.h: wrap OSMO_ASSERT() with do { ... } while (0)
Using do-while is a common practice for complex macros.  This allows
invoking OSMO_ASSERT in simple if-else statements without braces.

Change-Id: I42d9c315c9c30bce828564a63c496ee62e5c1431
2022-02-08 12:50:48 +06:00
Vadim Yanitskiy e59e839dd9 core/utils.h: add OSMO_LIKELY / OSMO_UNLIKELY macros
These macros are built on top of the __builtin_expect() function [1],
which provides the compiler with branch prediction information.

Similar macros exist in the Linux kernel: likely() / unlikely().

[1] https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

Change-Id: I0b029654ba050f079eed4a0574a3fa8019677067
2022-02-08 12:48:28 +06:00
Neels Hofmeyr cf7f7924d2 add osmo_sockaddr_from/to_octets()
Shorthand for the INET/INET6 switch() to get/put the addr part, useful
for encoding and decoding message buffers.

Related: OS#5599
Change-Id: Ie9e33bfac525c59c30714663d2bfcc62ec9eeb81
2022-02-07 22:13:20 +01:00
Neels Hofmeyr 1633735e9b add osmo_quote_str_buf3, osmo_escape_str_buf3
There already are osmo_quote_str_buf() and osmo_quote_str_buf2(), same
for _escape_, but none of them return the snprintf() like string length.
A private function does, publish this in the API.

The returned chars_needed is required to accurately allocate sufficient
size in string functions that call osmo_quote_str/osmo_escape_str. I am
adding such in osmo-upf.git.

Related: SYS#5599
Change-Id: I05d75a40599e3133da099a11e8babaaad0e9493a
2022-02-07 22:10:29 +01:00
Neels Hofmeyr 09d6574a45 add osmo_sockaddr_to_str_c(), osmo_sockaddr_to_str_buf2()
To easily log and print a sockaddr using OTC_SELECT, add
osmo_sockaddr_to_str_c().

Implement osmo_sockaddr_to_str_buf2() using osmo_strbuf, so that we can
return the chars_needed which osmo_sockaddr_to_str_c() uses.

From previous osmo_sockaddr_to_str_buf(), call
osmo_sockaddr_to_str_buf2() and return NULL if the buf_len was
insufficient, to mimick previous behavior. This makes it more
consistently returning NULL for insufficient buf_len, as shown in the
tweak that is needed in socket_test.c. Before osmo_sockaddr_to_str_buf()
would return a truncated port number, now it's all or NULL.

I will use osmo_sockaddr_to_str_c() in the new osmo-upf implementation.

Related: SYS#5599
Change-Id: I12771bf8a021e6785217b1faad03c09ec1cfef0e
2022-01-31 15:03:53 +00:00
Philipp Maier 4c44d46308 logging: log to stderr when logging is not initialized
When the logging framework is not initialized we get an error:

"ERROR: osmo_log_info == NULL! You must call log_init() before
using logging in ..."

There are sometimes situations where some code tries to log before
logging was initialied. This is a problem because the actual log
line with the debug info we need is covered up by the error message
from the logging framework.

Lets introduce a fallback logging function that is called when the
the logging framework is not available. This function can just use
fprintf to output to stderr.

Change-Id: I9b1b0988e02322e3e44fd4ceea3e1bc2d4df3c45
2022-01-25 17:49:20 +01:00
Neels Hofmeyr 13fa00e183 PFCP: add DLPFCP and osmo-upf port numbers
Related: SYS#5599
Change-Id: I0a46b147ec6a76d909df28136cfd2b764b2c75ea
2022-01-21 00:55:51 +01:00
Harald Welte e6fb890b98 log_taget_find() should use enum log_target_type, not int
This has shown up in -Wsign-compare

Change-Id: I2f5ba81aa0328db7db29f49f26de4cea3f522789
2022-01-09 12:04:22 +01:00
Harald Welte 7d6166a0e3 utils: Fix -Wsign-compare warnings
Change-Id: I8b1118ca519b0a419a42eab8b7d4ba9e26a0bab5
2022-01-09 12:04:19 +01:00
Harald Welte c85aaed3fb bitvec: Fix -Wsign-compare warnings
Change-Id: I34f65cda83bcd7050bd0cc0fb9e5cb5d33a09086
2022-01-09 12:04:16 +01:00
Philipp Maier ec5b42c8ce stats_tcp: use a default batch size of 5 instead of 1
The configuration defaults for the socket statistics are currently set
to a batch size of 1. This means that only one socket per timer
expiration is scanned. This rate is probably a bit low. To speed things
up a bit we should set the default to 5. Scanning 5 sockets at a time is
still in the affordable range.

Change-Id: I87abc74c00377191f7940c5b8f19d932618fc019
Related: SYS#5701
2022-01-05 20:32:07 +00:00
Sylvain Munaut d5974e9155 conv: Fix the traceback for tail biting codes
When picking the end state, looking only at the path metric
is highly suboptimal because in a tail biting code, we _know_ that
whatever treillis path is correct, it must start and end at the same
state. So we only consider path meeting that condition. We know any
path that doesn't isn't the right one. We only fallback to only
path metric if no path met that condition.

Fixes OS#4508

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Change-Id: I87e51d3880c0fe7bf3d6cd08fd46517a424a230c
2022-01-05 20:24:49 +00:00