Commit Graph

2641 Commits

Author SHA1 Message Date
Vadim Yanitskiy d93c1debb0 fake_trx/data_dump.py: fix python3 compatibility
There is no 'file' type in Python3 anymore, so let's reverse the
condition in DATADumpFile constructor. Also, the tag definition
was incorrect: both '\x01' and b'\x01' aren't the same.

Change-Id: Ib00c7f0bd5871fcfce931a4bfa501ae5bf797c45
2018-02-28 15:08:58 +07:00
Vadim Yanitskiy 77492b7926 fake_trx/data_msg.py: fix python3 compatibility in tests
In Python3 a range has it's own type, so its comparasion with
a list is incorrect. Let's explicitly convert both bit ranges
to lists in the bit conversation tests.

Change-Id: I98c40d3d63cbcdc3e5dc840ebf8d7310c5c08e56
2018-02-28 02:47:54 +07:00
Vadim Yanitskiy f35413691d fake_trx/burst_fwd.py: use DATAMSG transformation API
As the DATAMSG classes were introduced, let's use them.
This approach abstracts one from dealing with raw bytes.

Also, now BurstForwarder randomizes both RSSI and ToA values,
as this feature is supported from-the-box by the DATAMSG_TRX2L1.

Change-Id: Ib15018eab749150e244914dab4b6e433ce0c9209
2018-02-27 07:08:47 +07:00
Vadim Yanitskiy 615faadcfb fake_trx/data_msg.py: implement message transformation API
This change introduces two new methods, which allow to perform
L12TRX <-> TRX2L1 message type transformations.

Change-Id: Ic99cf74baa1864bf20a8fc0fc025604bc160084c
2018-02-27 06:49:07 +07:00
Vadim Yanitskiy 24e30142aa fake_trx/udp_link.py: set SO_REUSEADDR socket option
Setting this option allows one to reuse existing connections,
for example, by injecting CTRL commands or DATA bursts into
existing connections between fake_trx.py and trxcon.

Change-Id: I0882c76affa9a668a12d10967081054d2b666ed1
2018-02-27 04:57:58 +07:00
Vadim Yanitskiy 23446011af fake_trx/udp_link.py: drop useless UDPLink.loop() API
So far, this API is not used anywhere. Let's drop it.

Change-Id: I87ea2436f0b6bbeb62fe17700af48a048be143bb
2018-02-27 04:50:28 +07:00
Vadim Yanitskiy e5480d2c2b fake_trx/udp_link.py: close socket in destructor
Previously it was required to call the UDPLink.shutdown() method
manually in order to close a socket. Let's do this automatically
using the destructor of UDPLink.

Change-Id: I59c3dc61ec58cd9effeb789947d28fd602ca91f4
2018-02-27 04:40:28 +07:00
Harald Welte 05ea7248f8 trxcon|fake_trx: change default TRX port number to 6700
In order to avoid clashes with OsmoTRX, which may be also
running on the same host, let's use a different port range
starting from 6700 by default.

This idea was introduced as a result of OS#2984.

Change-Id: I66b5f25aaba3b836448ed29839c39869b5622bed
Related: OS#2984
2018-02-23 17:02:20 +07:00
Holger Hans Peter Freyther 8b9d3170ff mobile: Fix memory leak when not using a LUA script
The primitives are still allocated and dispatched but there was
no script handler to delete them. Change the ownership to delete
it at the end of the dispatch.

Change-Id: I510af13bcbb46f73a0a289f26a4921cc90bd986a
Fixes: OS#2925
2018-02-23 08:43:21 +00:00
Vadim Yanitskiy 318f8b78aa fake_trx/data_dump.py: use 2 bytes to store message length
One byte may store a value in range [0x00, 0xff]. The maximal 0xff
value is 255 in dec, so a message length is limited to 255 bytes.
This is enough for GSM bursts, but not for EDGE.

Since this change, two bytes of header are used to store the
pending message length. All captures created before are not
supported anymore...

Change-Id: I5a69d5cf2914fe56b2f9acca6054c9470627f91e
2018-02-20 19:43:02 +07:00
Vadim Yanitskiy d406afd23e fake_trx/burst_send.py: implement DATA capture support
Previously, this tool was only able to read a hand-crafted text
file with bursts and send them via the DATA interface. This is
not so useful...

This change implements support of reading DATA capture files,
which can be generated e.g. by trx_sniff.py or burst_gen.py.
Both standart input (stdio) and text-files are not supported
anymore.

Usage example:

  ./burst_send.py -m L1 -i capture.bin --timeslot 2

Change-Id: I626662bd1897c874421ab5178970ec19325f8a47
2018-02-20 19:29:00 +07:00
Vadim Yanitskiy 711e2f256e fake_trx/burst_gen.py: add burst capture support
Now all generated bursts can be also written to a capture file,
using a new option called '--output-file'. If a file already
exists, bursts would be appended to the end. Otherwise a new
capture file is created.

Change-Id: I074ff7dbc4d6beecdecce20de9dade5939e707f2
2018-02-20 18:19:48 +07:00
Vadim Yanitskiy 3dfd6cbae5 fake_trx/trx_sniff.py: use DATADumpFile for capture writing
Since we have a separate class for DATA capture management now,
no need to implement the wheel - let's just use it!

Change-Id: I7c30bcea294ce7270bf905ae5420a06dbc2e46f1
2018-02-20 18:02:35 +07:00
Vadim Yanitskiy afd110a3b5 fake_trx: implement classes for DATA capture menagement
This change introduces the following classes:

  - DATADump - basic class, which contains methods to generate
    and parse the a message header, and some constants.

  - DATADumpFile - a child class, which contains methods to
    write and parse DATA messages from capture files.

Usage example:

  # Open a capture file
  ddf = DATADumpFile("capture.bin")

  # Parse the 10th message
  msg = ddf.parse_msg(10)
  msg.fn = 100
  msg.tn = 0

  # Append one to the end of the capture
  ddf.append_msg(msg)

Change-Id: I1b31183bd7bcca94de089847ee0b2f4ec88a7f1d
2018-02-20 17:48:29 +07:00
Vadim Yanitskiy af4bad3125 mobile/primitives.c: fix format string compiler warning
The recent LUA integration code introduced the following
compiler warnings (on GCC 4.8.5):

primitives.c: In function ‘create_timer’:
primitives.c:90:2: warning: format ‘%llu’ expects argument of
                   type ‘long long unsigned int’,
                   but argument 7 has type ‘uint64_t’ [-Wformat=]

primitives.c: In function ‘cancel_timer’:
primitives.c:166:3: warning: format ‘%llu’ expects argument of
                   type ‘long long unsigned int’,
                   but argument 7 has type ‘uint64_t’ [-Wformat=]

The recommended and portable way of printing an 'uint64_t'
is to use the corresponding macros 'PRIu64'.

Change-Id: Ic7f54063a35a89ad54dfa63868f43009cbe469bb
2018-02-10 19:36:20 +07:00
Vadim Yanitskiy f54ebb06b9 layer23/cell_log: set default logfile to /dev/null
When '/var/log/osmocom.log' does not exist the cell_log
app cannot start normally, because it has no permissions
to create a new file. Furthermore, logfile is optional now.

Change-Id: I2a9982f221871c78c5c9a73b7b7a1787ff07a86c
2018-02-08 10:20:02 +00:00
Luca Melette e357646ed7 Import gprsdecode utility from SRLabs
This change introduces a modified version of gprsdecode utility,
which is intended to decode the GPRS burst captures and forward
decoded packets to the GSMTAP sink.

The following modifications were made:

  - use shared libosmocoding library for GSM 05.03 coding;
  - use optget for command line options parsing;
  - use a single application select loop;
  - use GNU automake as the build system;
  - add regression tests (GNU autotest);
  - clean up and comment the code;
  - add license headers;

The code is based on work of SRLabs:

  https://srlabs.de/
  git://git.srlabs.de/gprsdecode.git

Related: OS#1672
Change-Id: I12234d37c66b83b8abd60f7511fa1d7837db1856
2018-02-06 14:05:17 +07:00
Sylvain Munaut 9fa291dd2b l1ctl_proto.h: define burst indication messages
One burst indication message carries a single raw burst, forwarded
to the higher layers from DSP. The burst bits are hard-bits (0 or 1)
coming from demodulator, packed to 14.5 bytes. This is why we call
them 'raw' - no bit correction nor deciphering is performed.

Related: OS#1672
Change-Id: I75e33c38accdf2a0af961c89836c5e7a3a056bda
2018-02-06 02:56:31 +07:00
Vadim Yanitskiy 041bfc0b03 fake_trx/burst_send.py: handle both GSM and EDGE bursts
Previously, it was expected that burst length should be equal
to 148. Let's also handle EDGE bursts and use GSM constants.

Change-Id: Iab13dd06f175556137c5e25d2cbddb9bea403b09
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy 630cc5a367 fake_trx/burst_send.py: also handle RSSI and ToA values
Change-Id: Idb9a5ae4a8980a320f6e620c66add7c7393d3ecb
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy e3a23102b7 fake_trx/burst_gen.py: also handle RSSI and ToA values
Change-Id: I7c9441c1154c925dcb5c743e39445495233c123e
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy d273ebf611 fake_trx: use DATAMSG classes for DATA messages
The DATAMSG API, that was introduced and extended a few commits
before, provides all required methods to create, validate,
generate and parse DATA messages. Let's use it now.

Change-Id: Ibc99126dc05d873c1ba538a5f4e74866de563f56
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy 263ccef268 fake_trx/burst_gen.py: don't store RandBurstGen
No need to keep it as a class member.

Change-Id: I5bf5846c2b8fa1211cf5150545b9d001c17fa0eb
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy b84699096a fake_trx/burst_gen.py: check argv separately
Change-Id: I35b5475d3b6df6dc92a1981c693afb63df866c87
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy d9553faf62 fake_trx/data_msg.py: implement header description
This change introduces a new method for both types of messages
called 'desc_hdr', that generates human-readable header
description.

Examples:

  TRX -> L1: fn=571353 tn=1 rssi=-108 toa=-0.53
  L1 -> TRX: fn=1777477 tn=3 pwr=161

Change-Id: Iafe63e39ad68f4ff373ae098424d76ca9f83c8fc
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy 475ece7182 fake_trx/data_msg.py: handle bursts properly
One L1 -> TRX message carries one to be transmitted burst encoded
as regular bits (0 or 1). One TRX -> L1 message carries one
received burst encoded as unsigned soft-bits (0..254).

This shall be noted during message encoding and decoding process.
Also, we shall distinguish between GSM and EDGE bursts.

Change-Id: I909b7a4dc70e8c632987bde07f00281a6595c4cb
2018-01-29 04:19:01 +07:00
Vadim Yanitskiy 8c79e2ce6b fake_trx/data_msg.py: implement header randomization
This feature could be used by both burst_gen.py and burst_send.py.

Change-Id: I724e267382ff32ef1f964b1ee6cbe99069139867
2018-01-29 04:18:56 +07:00
Vadim Yanitskiy f10a8d4c92 fake_trx: implement classes for DATA messages
This change introduces three new classes:

  - DATAMSG - abstract class, defines common fields and methods
    for any message on DATA interface, e.g. frame and timeslot
    numbers, bit conversation methods, etc.

  - DATAMSG_L12TRX - a child of DATAMSG, defines a message
    coming from L1 to TRX.

  - DATAMSG_TRX2L1 - a child of DATAMSG, defines a message
    coming from TRX to L1.

Both child classes could be used to generate DATA messages from
known fields (i.e. fn, tn, etc.), and parse them back from
already encoded DATA messages.

Change-Id: Id1c72f0b18fb128acc74d0cd899fb7aab7bd8790
2018-01-29 04:14:34 +07:00
Vadim Yanitskiy 5da2ac7197 fake_trx: share and use common GSM constants
Previously there were multiple definitions of some common GSM
constants in different modules. Let's share them.

Change-Id: Id6cdfbc6e8688755a0df7e44daa512c9afa7dad2
2018-01-29 03:49:35 +07:00
Max 75e11d1d44 Don't ignore top-level Makefile
Move corresponding .gitignore entry inside virt-phy to avoid interfering
with other subprojects still using hand-crafted Makefiles.

Change-Id: I19a8661b74ae0b28da51cf2e81f0ca40de76fcbd
2018-01-22 17:33:54 +01:00
Max 4ee98c9db6 cosmetic: fix Makefile whitespace
Change-Id: Ia55d54d7ec7ec04e122d2e5250037c2d166abeb5
2018-01-22 17:18:31 +01:00
Vadim Yanitskiy ab7eb390cb fake_trx: implement a new tool for TRX protocol sniffing
This change introduces a new tool, which could be used to sniff a
single connection between L1 and TRX in both directions, filter
captured bursts by direction, timeslot and/or frame number, and
finally write them to a binary file for further analysis.

Sniffing capability is based on Scapy framework, so it should
be installed in order to run this tool. Please also note,
that sniffing requires root access. For details, see:

https://github.com/secdev/scapy
https://scapy.readthedocs.io/en/latest/

Usage example:

  sudo ./trx_sniff --frame-count 30 --timeslot 2 -o /tmp/bursts

This command will capture 30 frames on timeslot number 2, and
write them to a binary file. The format of this file is based
on TLV (Tag Length Value), that wraps each burst:

  ... |-TAG (byte)-|-LEN (byte)-|-BURST (LEN bytes)-| ...

  TAG 0x01 - a message coming from L1 to TRX
  TAG 0x02 - a message coming from TRX to L1

Change-Id: I6e65e1d657574cc3e67bc7cdb1c01ef6bf08ecde
2018-01-21 02:13:47 +06:00
Vadim Yanitskiy 32462cfd62 fake_trx/burst_send.py: indicate actual burst source
Change-Id: I7e45996f4a7a2aacc962ff9b65107c6b04e7bf68
2018-01-20 16:44:19 +06:00
Stefan Sperling df1049f380 mobile: Print an error message if the VTY cannot be initialized
If we fail to initialize the VTY, print an error mesage instead of
failing silently. For example:
"Cannot init VTY on 127.0.0.1 port 4247: Address already in use"

Change-Id: I24161f53fa621ae1c8b1916bd0c8055c494b531e
2018-01-18 15:40:57 +01:00
Vadim Yanitskiy 0192c028e4 trxcon/scheduler: use TCH frame length defs from libosmocodec
Change-Id: I6439d3cadd2dc1fa8fe401eb61c977a12ec844f2
2018-01-05 15:06:48 +07:00
Vadim Yanitskiy f09be8a9af trxcon/scheduler: drop meaningless TODO comment
Since both TA and AGC loops should be implemented in transceiver,
this TODO is meaningless. Let's drop it.

Change-Id: I84979712e2a1b849acaee53d5cd50de4e1e357c2
2018-01-05 14:36:03 +07:00
Vadim Yanitskiy bd6e320c08 trxcon/scheduler: use linuxlist API for lchan management
As there is no any order relation between logical channels, it's
better to use the linuxlist API instead of talloc array.

Change-Id: I5a78582c77ed1ab33817d240e065dc4cd4708199
2018-01-05 14:35:37 +07:00
Vadim Yanitskiy 0c201abbff trxcon/scheduler: deactivate lchans when resetting / deleting TS
Previously, when resetting or deleting a timeslot, we did not
deactivate the logical channels, relaying on talloc hierarchical
nature. This approach may cause some problems, e.g. on embedded
systems with emulated talloc API.

Change-Id: I8c34c793df87bd8c79b7bf1f05b949faf10520e8
2018-01-05 14:35:37 +07:00
Vadim Yanitskiy 5c70e48077 trxcon/scheduler: reset lchan state after deactivation
Let's assume that a logical channel, which was already in use,
is activated again for a new connection. As we don't reset the
state variables, such as burst masks or ciphering data, it may
cause an unexpected behaviour.

In order to avoid this, let's always reset the logical channel
state after deactivation.

Change-Id: I91e736a97cb05b167614cb488a00d847a9a859e0
2018-01-05 14:35:29 +07:00
Vadim Yanitskiy 96da00d457 trxcon/scheduler: share chan / prim identification helpers
Because they would be also used outside.

Change-Id: Ic8af9d7c72fdb124caef82e35170f92b84e16eb9
2018-01-05 14:34:49 +07:00
Vadim Yanitskiy 6c0b1261a3 trxcon/scheduler: FIX: return NULL from TCH dequeue function
Initially it was expected that a TCH transmit queue could contain
TCH and FACCH primitives only. But there are also SACCH primitives,
which are also being stored there.

So, let's drop the assertations from the sched_prim_dequeue_tch(),
and return NULL if nothing was found.

Change-Id: Iae37057d35883c09a76f0612e52c2d14d9ff91cb
2018-01-04 00:10:18 +01:00
Holger Hans Peter Freyther 96e5f8cbe5 mobile: Add lua examples for basic functions that are available
Link to Lua docs, link to our manual. Demo logging, timer, MS
on/off, sms sending and sms receiving. For the MM state I will
need to export constants/names to make this usable. Currently
it is a bit of a hack (first time to MM_IDLE) to send a SMS. We
would know when we attached though.

Change-Id: I10ac656330b65e3905d6cbbb7865aa0f969cd9ff
2017-12-27 10:51:32 +08:00
Holger Hans Peter Freyther ceb0875f1a mobile: Properly close the primitive interface on reload
When reloading a script go through script_lua_close. Get the
primitive first. Then destruct the lua environment which will
lead to GC (e.g. cancellation of timers) and then delete the
primitive code.

Change-Id: I5bb4fa9e7c5010f3ad50b258dcb14956eea8822a
2017-12-27 10:50:14 +08:00
Holger Hans Peter Freyther a8130aba91 mobile: Send SMS through the primitive interface
Make this symmetric and send the SMS through the primitive
interface. Construct and copy the sms into the prim, store
the SCA in the prim as well. In 04.11 we see we can store
2*10 digits in the destination address and a NUL.

Change-Id: I91d7537f4f6ce5ba00218c58f3456947ec7bc662
2017-12-27 10:07:17 +08:00
Vadim Yanitskiy feec102aea trxcon/scheduler: implement A5/X ciphering support
This change implements the A5/X ciphering support transparently
for the logical channel handlers. In other words, a DL burst is
deciphered before being passed to a handler, and an UL burst is
ciphered before being sent to transceiver.

The implementation mostly relays on the libosmocore's A5 API.

Change-Id: Ib53418d8c0f394fdece09cf5cc240887cb0bb5af
2017-12-18 06:17:50 +07:00
Vadim Yanitskiy 44838f79a2 trxcon/scheduler: preprocess UL bursts before sending
Having a possibility to preprocess UL burst before sending to
transceiver is required for the further ciphering support
integration and probably some other tasks.

Change-Id: Ia6eead5d4f51d7c0bf277b9d5ebb0a74676df567
2017-12-18 06:04:29 +07:00
Vadim Yanitskiy 255f25ef25 L1CTL/L1CTL_CRYPTO_REQ: add key length and channel info
Previously, the L1CTL_CRYPTO_REQ message contained only a ciphering
algorithm and actual Kc key to be used. The key length was
calculated manually using the MSGB API.

Let's avoid manual calculations here, as it may cause unexpected
behavior if the message structure is changed. Also, let's fill
the UL header with minimal information about a channel, which
is going to be encrypted.

Change-Id: I1813a188e755141241273479b17896415abcc3f1
2017-12-18 06:04:29 +07:00
Vadim Yanitskiy 32c2a1d74c trxcon/scheduler: prioritize FACCH correctly
Previously we used to compare two consecutive first primitives,
taken from a transmit queue. This approach may cause some delay,
which is critical for FACCH e.g. in case of handover.

Let's walk through a whole transmit queue to find a pair of
both FACCH frames, and only then decide what to do.

Change-Id: I925cca77bfaa255dd095bc882c901d41c9bc4633
2017-12-18 05:26:57 +07:00
Vadim Yanitskiy a403215bea trxcon/scheduler: move prim management outside lchan handlers
Previously, each lchan handler used to obtain and delete primitives
from a timeslot's tranmit queue itself. This approach entails many
potential problems and bugs:

  - The lchan handlers shall not do that by definition, they
    should encode and decode frames according to GSM 05.03.

  - In some cases (e.g. TCH), a single transmit queue may contain
    primitives of different types (e.g. TCH, FACCH and SACCH). At
    the same time, the lchan handlers don't care and don't even
    know about each other. So, this could cause an unexpected
    behaviour in some cases.

This change separates all primitive management routines,
providing a new API for obtaining and dropping them.

"Write programs that do one thing and do it well."

Change-Id: I29503ece51903784bc53541015285234471c8d15
2017-12-18 05:26:48 +07:00
Vadim Yanitskiy 15d512d301 trxcon/scheduler: separate primitive management code
It's good to write, keep and make the source code as much modular
as possible. So, Tte primitive management code was separated to
the 'sched_prim.c' and going to be extended in the near future.

Change-Id: Ifec8c9e4f2c95c72b00772688bcb5dc9c11d6de7
2017-12-18 05:20:25 +07:00