Hello everybody,
I was trying to setup an OSMO-MSC with an Open5Gs-Corenetwork, so I can send SMS to different UEs. Unfortunately the OSMO-MSC does not connect to the MME of the Open5Gs-Core and I do not find any installation guide for this specific setup.
For your information: The Open5Gs-Core runs on a Laptop and I build the Software from source (4G and 5G components). The MSC should run on the same Laptop.
Therefore I would like to ask you, if you can tell me, which other components besides of the OSMO-MSC I possibly have to install and how I should configure this components and the components of the core.
Many thanks in advance!
Best regards
Lilly Hennig
So, we've been discussing IRL about the osmo-hnbgw implementation of
interacting with nftables from a separate thread.
The idea now is that a separate thread gets the results from nftables, caches
them and enqueues them, so that the main thread can update the hnbgw counters
in-sync. A second separate thread does nft add/del rule maintenance.
There is another complication, and I want to make sure we agree on the solution:
Problem: to delete a rule, I need to retrieve its 'handle' first.
With the amount of threading we want, this becomes a bit complex.
So. We 'add rule' and 'delete rule', as hNodeB attach and detach.
But, to be able to 'delete rule', we need to retrieve an id that nftables
assigned to this rule when it was added, the 'handle':
add rule inet osmo-hnbgw gtpu-ul ip saddr 1.2.3.4 counter comment "ul:1-2-3-4";
...
list table inet osmo-hnbgw
-->
table inet osmo-hnbgw {
chain gtpu-ul {
ip saddr 1.2.3.4 counter packets 5 bytes 100 comment "ul:1-2-3-4" # handle 23;
} ^^^^^^^^^
}
...
delete rule inet osmo-hnbgw gtpu-ul handle 23;
^^^^^^^^^
AFAICT I cannot set a handle right from the start. I can also not delete a rule
by just stating it again as it is, nor by using the 'comment' as a handle. nft
wants a 'handle', period. Does anyone know better?
Every time we read counters, osmo-hnbgw also retrieves the handles for each
rule, and correlates via the 'comment'. Similarly to counters, we can only get
all handles at once, via a complete table dump (possibly inefficient).
It works out fine in most practical cases. But the complex corner case is when
an hNodeB detaches quickly, before the counters had a chance to run and update
the hNodeB's state, including the handle.
In the current agreement on our implementation with two threads for nft, with
queues back to the main thread, it would go something like this, to avoid
races:
main() nft_maintenance_thread() nft_read_counters_thread()
| | |
|---add hNodeB-------->| |
|<--ok-----------------| |
X | |
|---del hNodeB-------->| |
| [rule handle unknown!] |
..|<--EAGAIN-------------| |
. | | |
. |---do counters--------------------------------->|
. | | [work]
. | | [work]
. | | [work]
. |<--update-counters-and-handles------------------|
. | | |
..|---del hNodeB-------->| |
| [delete rule] |
|<--done---------------| |
Simplifying a bit...
main() nft_maintenance_thread() nft_read_counters_thread()
| | |
|---add hNodeB-------->| |
|<--ok-----------------| |
X | |
[want: del hNodeB] | |
[rule handle unknown!] | |
[set some "del" flag] | |
. | | |
. |---do counters--------------------------------->|
. | | [work]
. | | [work]
. | | [work]
. |<--update-counters-and-handles------------------|
. | | |
[del flag!] | |
|---del hNodeB-------->| |
| [delete rule] |
|<--done---------------| |
I'm not liking very much the amount of complexity spawning here, but
this last approach is ok I guess, do you agree?
i.e. when the handle is not set yet, set a flag on the hNodeB,
and trigger the 'delete' the next time the counter thread reports back a handle
for the hNodeB.
~N
--
- Neels Hofmeyr <nhofmeyr(a)sysmocom.de> https://www.sysmocom.de/
=======================================================================
* sysmocom - systems for mobile communications GmbH
* Siemensstr. 26a
* 10551 Berlin, Germany
* Sitz / Registered office: Berlin, HRB 134158 B
* Geschaeftsfuehrer / Managing Director: Harald Welte
Dear mailing list,
as announced in https://osmocom.org/news/246, the rpm packages for
CentOS 8 / AlmaLinux 8 are unmaintained.
sysmocom is currently still ensuring that the rpm binary packages build
from the rpm spec files we have in our git repositories. But this is
also significant effort that we would rather spend elsewhere, and so we
are considering to stop providing rpm builds altogether and possibly
removing these spec files from our git repositories.
This affects the official Osmocom binary package repositories (nightly
and latest) for CentOS 8/AlmaLinux 8 and openSUSE Tumbleweed.
Stable versions of Osmocom programs are also in openSUSE's official
repositories and can be installed from there.
So, is anyone using the official Osmocom rpm repositories?
As OsmoDevCon is coming up this weekend, we can also discuss it there,
feel free to talk to me about it.
Best regards,
Oliver
--
- Oliver Smith <osmith(a)sysmocom.de> https://www.sysmocom.de/
=======================================================================
* sysmocom - systems for mobile communications GmbH
* Siemensstr. 26a
* 10551 Berlin, Germany
* Sitz / Registered office: Berlin, HRB 134158 B
* Geschaeftsfuehrer / Managing Director: Harald Welte
Dear Osmocom developers,
In our project we have been using the gsmtap pseudo-header to store UMTS and LTE signalling traces in pcapng format. This is very efficient compared to our previous implementation based on DLT_USER, and thanks to the gsmtap dissector, it allows any *shark app to read our output file.
When looking for the proper type and sub_type for NR signalling traces, I discovered they are not yet part of the standard. I found several threads of discussion about this, from about 2017 onwards, and I understand it is a matter of time and resources if the version 3 of GSMTAP has not been released.
The most interesting feature I have read about is the ability to extend the header with a TLV approach. EARFCN, eNodeB-ID, PCI, are useful metadata we would like to add to our traces.
In an ideal world, I would like things to be put in motion so that a new version of GSMTAP could see the light. More humbly, I ask you what kind of help is needed. Are you waiting for a draft specification? Are all requirements well known?
I suppose that LTE and NR are not the main focus today for liboscmocore development, but there are many projects out there waiting for the GSMTAP format to be updated.
Thanks!
Mauro
Hi all,
we are currently having lots of discussions on (non-)blocking I/O. I'd like to
put these thoughts out there for that discussion, because there seems to be a
misunderstanding in terms.
Blocking never goes away, it is just reduced to other orders of magnitude.
Types of "blocking":
- blocking or non-blocking pipes: will writing to a file or socket stop the
program until the pipe is ready for writing? (basic "OS level" I/O)
- synchronous or asynchronous event handling: will the program stop until a
remote side has responded, or can the program handle other events in the
meantime? (one job queue, one worker == osmo_select_main())
- sequential or parallelized event handling: can events be handled
concurrently, or just one after the other?
(one or more job queues, more than one worker)
- concurrent access of resources: a given resource is not thread-safe, hence
one thread needs to wait for the other to release a resource lock.
(This is always present, the aim is to hit a sweet spot of least locking.)
In osmo programs I have worked on, we do the first two, but not the other two.
Asynchronous event handling is the bare minimum for a server program to be
functional. Non-blocking pipes is a common addition that is easy to do.
From then on we enter the world of parallelization, and things get very complex
very quickly. It is possible to cause more blocking than before. It is possible
to significantly increase the load, instead of improving.
I am familiar with parallelized non-blocking event handling and I/O, from
realtime audio+video+control hacking. We do not use any of these techniques in
osmo programs I have worked on -- for good reasons, I thought.
The spectrum, from most blocking to most non-blocking:
- single-threaded, single queue with async defer;
- task queue with multiple worker threads;
- scheduling based on fairness or urgency;
- map/reduce across a cloud, in a functional language.
We're almost all the way to the blocking end of the parallelization spectrum.
So far I thought that this was a conscious choice. Async-but-blocking is low
complexity, with large benefits in maintainability and stability.
Example:
If we have pending, say, 10 incoming packets on three different links, we
handle each packet one by one when it is its turn. If one subscriber's incoming
measurement report triggers longish handover calculations, any events like an
MGCP ACK or SCCP CC for some other subscribers will have to wait in line, even
though they might take a thousand fold less time to complete.
OsmoBSC works well in that fashion, even for hundreds of cells and multiple
MSC: compared to audio+video+control, CNI signalling has huge tolerances on
timing. This is why 3GPP separates control-plane from user-plane.
It is important to balance all of these aspects!
---
It was mentioned somewhere that our VTY is both asynchronous and non-blocking.
I do not agree at all and would like to explain, as an example of the above.
Our vty server is NOT asynchronous. When a VTY request comes in, the vty
function must directly vty_out() the response. We cannot defer the VTY response
asynchronously like any other protocol can (see example below).
Our VTY structures, and the program-specific internal state that VTY
manipulates and queries, are not thread-safe. The VTY server cannot be
parallelized as it is now.
A contrived example:
Let's say we wanted to query nft counters from a VTY command:
* read VTY command from user,
* do some nft command asynchronously,
* and print back the result when nft is done.
Naively, we could store the struct vty * somewhere, and exit the vty handling
function. When nft is done some time later, just vty_out() the result to that
struct vty * that we still have from earlier. But there are problems:
If the user closed the telnet session in the meantime, this struct vty * is
stale and the program will crash. We need a cancel mechanism to avoid that.
Also when a VTY command function is done, we directly transmit the next VTY
prompt. vty-test scripts (`expect`) won't function properly when more response
data arrives after the prompt is received; human users may be confused.
So our VTY server is *both* Synchronous and Blocking. It is not trivial to make
it async (like all of our other protocols are) and non-blocking (which we have
nowhere in osmo-cni yet).
---
These are the kinds of mechanisms I care about in our discussions:
- "blocking" on what time scale?
- tradeoff with code complexity and maintainability.
- tradeoff with code stability and determinism.
- tradeoff with system performance load due to additional management and caching.
One does not simply put things in threads.
There are very non-trivial aspects that *always* come with it,
one of them is super good, most of them are pretty bad.
~N
--
- Neels Hofmeyr <nhofmeyr(a)sysmocom.de> https://www.sysmocom.de/
=======================================================================
* sysmocom - systems for mobile communications GmbH
* Siemensstr. 26a
* 10551 Berlin, Germany
* Sitz / Registered office: Berlin, HRB 134158 B
* Geschaeftsfuehrer / Managing Director: Harald Welte
Dera Team,
I am facing this error.
[root@ip-172-31-27-63 libosmo-sccp]# ./configure.ac
./configure.ac: line 1: dnl: command not found
./configure.ac: line 2: syntax error near unexpected token `[libosmo-sccp],'
./configure.ac: line 2: `AC_INIT([libosmo-sccp],'
[root@ip-172-31-27-63 libosmo-sccp]#
Kindly help here . Thanks .
Regards,
Sandeep Malik
Dear Osmocom community,
About a year ago I published this specification:
https://www.freecalypso.org/specs/tw-ts-001-v010001.txt
TW-TS-001 is a spec, written in 3GPP language style, for enhanced RTP
transport of FR and EFR codec frames in an IP-based GSM RAN. I got
OsmoBTS support for this RTP extension on branch falconia/rtp_traulike,
but I never submitted it to Gerrit for mainlining: when I mentioned it
in OsmoDevCall in 2023-06, the feedback from Harald was that the
extension would need to be somehow requested from the CN via signaling,
rather than manually switched on via OsmoBTS local vty. Since then I
have familiarized myself with 3GPP specs for AoIP user place (TS 48.103
and TS 26.102 it refers to), and I see the problem with my initial
"brute force" method: when 3GPP specs explicitly call for standard RTP
formats at the AoIP interface, intentional deviations from that standard
need to be negotiated/signaled in some clean manner.
So here is my new solution:
https://www.freecalypso.org/specs/tw-ts-001-v010100.txthttps://www.freecalypso.org/specs/tw-ts-002-v010100.txthttps://www.freecalypso.org/specs/tw-ts-003-v010001.txt
There are 3 new specs in the above set:
* The new version of TW-TS-001 clarifies some deficiencies in the
original, and refers to TW-TS-003 for how the enhanced RTP format is
to be invoked at the AoIP interface.
* TW-TS-002 is a new spec that does for HRv1 codec what TW-TS-001 does
for FRv1 and EFR. The enhanced RTP payload format here is an
extension of RFC 5993, which I named super-5993.
* TW-TS-003 is an extension to BSSMAP for communicating the use of
enhanced RTP payload formats between MSC and BSS.
I will now be preparing some patches for TW-TS-003 support - see you
in Gerrit code review soon. :-)
With love and greetings from Themyscira,
Mother Mychaela
Hello Osmocom community,
Would anyone here happen to have a capture of a TRAU-UL frame stream
from some historical E1 (or T1) BTS? And if no already existing UL
capture is available, if I found someone with access to such equipment
who would be willing to do a few tests for me, what would be the way
to make such capture? I mean raw Abis UL capture, *not* converted to
RTP or anything else, and because I don't have any T1/E1 hardware
currently, I am not really familiar with Osmocom tools for working with
such hw and what tap/trace/capture mechanisms are available.
And yes, I see on the wiki page for OsmoDevCon that some E1 BTS hw
will be present at the event - but my lack of an updated travel
document from USCIS still precludes me from traveling anywhere outside
of USA+Canada+Mexico territory. :(
M~
Hi all,
I'm making a talk about tips and tools for doing more effective Osmocom
related development.
Some ideas I have for it currently:
* how to build your own (deb, rpm) packages with OBS
* how to run CI stuff (like the checkpatch linter) locally
* running tcpdump over SSH and piping it into wireshark
* finding what regression caused a ttcn-3 failure systematically
Is there anything (within this list or other ideas) you would find
particularly interesting, or boring?
If you have a couple of tips or tools to share, and would like to
present them yourself: let me know as well, then we could turn this into
a quick lightning talk series with multiple presenters.
Best,
Oliver
--
- Oliver Smith <osmith(a)sysmocom.de> https://www.sysmocom.de/
=======================================================================
* sysmocom - systems for mobile communications GmbH
* Siemensstr. 26a
* 10551 Berlin, Germany
* Sitz / Registered office: Berlin, HRB 134158 B
* Geschaeftsfuehrer / Managing Director: Harald Welte
Dear experts
We try to configure osmo-bsc / osmo-mgw to be able to communicate with ERICSSON MSC/MGW.
The UE is well registered but we don't know how to well configure bsc.
We have this config file osmo-bsc.cfg:
- 172.20.10.10 is a local BSC address to communicate to STP, MSC, MGW
osmo-bsc
mgw 0
local-ip 172.20.10.10
local-port 2427
remote-ip 172.20.10.10
remote-port 2727
reset-endpoint rtpbridge/*
We have on the BSC a local mgw, and here is the osmo-mgw.cfg file:
172.20.10.19 is another address on the BSC towards the osmo-bts-trx.
osmo-mgw
mgcp
domain mgw
bind ip 172.20.10.10
bind port 2727
rtp port-range 4002 16001
rtp bind-ip 172.20.10.19
rtp ip-probing
rtp ip-dscp 0
rtp keep-alive once
rtcp-omit
rtp-patch ssrc
rtp-patch timestamp
no rtp-patch rfc5993hr
sdp audio-payload send-ptime
sdp audio-payload send-name
number endpoints 512
osmux off
Sure we made errors and misunderstood.
During test call, we can see in the trace, a Call proceeding, then a BSSMAP Assignment Request followed by a BSSMAP Assignment Complete.
The problem is that the IP choosen as AoIP Transport Layer Address is the OAM address of the BSC (seen in In GSM A-I/F BSSMAP Assignment Complete trace section - UDP port 4004).
How to change this in order to set 172.20.10.10 as the AoIP Transport Layer Address ?
Many thanks in advance,
best regards
Jean-Marc