Commit Graph

645 Commits

Author SHA1 Message Date
Vadim Yanitskiy 5cb7e287ed trx_toolkit/fake_trx.py: migrate from getopt to argparse
Change-Id: I0218a328671c591b20b0666dc7c39ba865892acc
2018-12-07 08:20:37 +07:00
Vadim Yanitskiy 060b2729d1 trx_toolkit/trx_sniff.py: migrate from getopt to argparse
Change-Id: Id1dacaa32134bfa68344e6c48310390cdd85cdc9
2018-12-07 08:08:49 +07:00
Vadim Yanitskiy 66b7e78eb1 trx_toolkit/ctrl_cmd.py: migrate from getopt to argparse
Change-Id: Ib9bf5ed7384c4f34478975cefe03880eb2fc8069
2018-12-07 08:08:45 +07:00
Vadim Yanitskiy 3fee14b5a3 trx_toolkit/burst_send.py: migrate from getopt to argparse
Change-Id: I1be66aa022a79aa1683f0e6cfebaed568b1736b1
2018-12-07 07:15:45 +07:00
Vadim Yanitskiy 51dd1dc703 trx_toolkit/burst_gen.py: migrate from getopt to argparse
Change-Id: I7eb3f2e2713f1f97293bd47a2eae3b140f63fb59
2018-12-07 06:52:59 +07:00
Vadim Yanitskiy 54a8c02a80 trx_toolkit/burst_gen.py: fix short version of --burst-type
Both '--bind-addr' and '--burst-type' had the same short '-b'.
Let's use the upper case version for '--burst-type'.

Change-Id: Ib8a46e25cbc6266c3e147582f9e8045362270151
2018-12-07 05:54:26 +07:00
Vadim Yanitskiy 6bab6acee6 trx_toolkit: use generic logging module instead of print()
There are multiple advantages of using Python's logging module:

  - advanced message formatting (file name, line number, etc.),
  - multiple logging targets (e.g. stderr, file, socket),
  - logging levels (e.g. DEBUG, INFO, ERROR),
  - the pythonic way ;)

so, let's replace multiple print() calls by logging calls,
add use the following logging message format by default:

  [%(levelname)s] %(filename)s:%(lineno)d %(message)s

Examples:

  [INFO] ctrl_if_bts.py:57 Starting transceiver...
  [DEBUG] clck_gen.py:87 IND CLOCK 26826
  [DEBUG] ctrl_if_bts.py:71 Recv POWEROFF cmd
  [INFO] ctrl_if_bts.py:73 Stopping transceiver...
  [INFO] fake_trx.py:127 Shutting down...

Please note that there is no way to filter messages by logging
level yet. This is to be introduced soon, together with argparse.

Change-Id: I7fcafabafe8323b58990997a47afdd48b6d1f357
2018-12-07 05:36:20 +07:00
Vadim Yanitskiy 72c8296bfe trx_toolkit/fake_trx.py: drop randomization related cmd options
The randomization of both UL/DL RSSI and ToA values is optional,
and can be configured from the control interface (see both
FAKE_RSSI and FAKE_TOA commands).

The command line options for enabling / disabling the randomization
were redundant, so let's get rid of them and check if the
corresponding treshold value is set.

Change-Id: I6adc13b8989ade2fab895673525c0ca17bf9b3f2
2018-12-07 03:06:54 +07:00
Vadim Yanitskiy 6c4d9b6284 trx_toolkit/burst_fwd.py: also pass-filter UL bursts by time-slot
For some reason, the time-slot pass-filtering was only done for
DL bursts, but not for UL bursts. BurstForwarder shall not pass
UL bursts for unconfigured time-slots too.

Let's also print a warning if an UL burst is sent on a not
configured time-slot, i.e. before sending SETSLOT command.

Change-Id: Idb7f5b212e5814aeff8ca8bc875ad066674267cd
2018-12-07 03:06:54 +07:00
Vadim Yanitskiy cadbce066b trx_toolkit/burst_fwd.py: properly pass-filter multiple time-slots
Previously it was only possible to configure a single time-slot
that would be pass-filtered by a BurstForwarder instance. In some
applications it would be useful to configure multiple time-slots,
so let's refactor the time-slot pass-filtering algorithm.

Change-Id: Ie1490adaf7a7c62c966aeb60c1898eaf3b5a1e84
2018-12-07 03:06:49 +07:00
Vadim Yanitskiy 8d70f9d9fe trx_toolkit/burst_fwd.py: document and refactor BurstForwarder
Instead of having all configuration variables of BurstForwarder
initialized in the class heading, let's introduce two functions
for initialization (resetting to defaults) of both UL/DL params.
This would allow to reset a BurstForwarder instance from the
control interface in follow-up patches.

Let's also introduce some basic documentation for the class
fields, which were defined in the heading previously.

Change-Id: I6b1bf41cf22f01a7e7ecc91c625fb0d2bf4bfeac
2018-12-06 07:42:07 +07:00
Vadim Yanitskiy 219ed20cb5 l1ctl_proto.h: use flexible array member for traffic messages
Unlike the DATA messages, traffic frames may have different length.
Instead of having fixed payload (i.e. TCH frame) length, let's
introduce a flexible array member. This would allow one to
calculate the frame length using the MSGB API.

Change-Id: I119fa36c84e95c3003d57c19e25f8146ed45c3c6
2018-11-05 05:13:57 +00:00
Pau Espin 5516f2cad3 fake_trx: introduce CTRL commands for RSSI simulation
Since FakeTRX is a proxy, it basically emulates transceiver for
both osmo-bts-trx and trxcon, hence there are two separate and
independent control interfaces (usually, ports 6701 and 5701).

All simulation commands (see 'FAKE_*') are usually implemented
on both interfaces separately:

  - ctrl_if_bb.py - simulation commands affecting Uplink,
  - ctrl_if_bts.py - simulation commands affecting Downlink.

This change introduces the 'FAKE_RSSI' command for both CTRL
interfaces in two variations:

  - absolute: CMD FAKE_RSSI <BASE> <THRESH>
  - relative: CMD FAKE_RSSI <+-BASE_DELTA>

where 'THRESH' affects optional value randomization.

Change-Id: Ic01c31fb0304345dd7337c3ee1c7ee3c2d3e8460
2018-10-23 00:00:13 +02:00
Pau Espin f6e1429f80 firmware: set corret shebang in solve_envs.py python2 script
Change-Id: I64582568f7390b7f4e3253508209a59eb78ee4dd
2018-10-22 10:00:31 +02:00
Vadim Yanitskiy a49b63ce5a l1ctl_proto.h: extend ccch_mode enum with CBCH
According to GSM TS 05.02, there are two ways to enable CBCH:

  a) replace sub-slot number 2 of CCCH+SDCCH/4 (comb. V),
  b) replace sub-slot number 2 of SDCCH/8 (comb. VII).

Unlike SDCCH/8 (case b), CCCH+SDCCH/4 can be allocated on TS0
only, and shall not use frequency hopping. This means that
implementing CBCH support on SDCCH/8 would require much more
efforts than on combined CCCH+SDCCH/4, as in last case CBCH
messages can be received without the need to switch from
idle to dedicated mode.

This change introduces a new ccch_mode item, which should be
used by the higher layers to indicate presence of CBCH channel
on C0/TS0, so the PHY would enable decoding of CBCH messages
on CCCH+SDCCH/4 (case a) in idle mode.

Regarding to CBCH on SDCCH/8 (case b), it makes sense to
extend the 'l1ctl_dm_est_req', so it would be handled in
dedicated mode on request from the higher layers.

Change-Id: Ia94ebf22a2ec439dfe1f31d703b832ae57b48ef2
2018-10-03 08:37:11 +00:00
Alex Badea bd7e58f914 firmware/layer1: add scheduler tasks for CBCH
According to GSM TS 05.02, section 3.3.5, Cell Broadcast Channel
(CBCH) is a downlink only channel, which is used to carry the
short message service cell broadcast (SMSCB). CBCH is optional,
and uses the same physical channel as SDCCH. More precisely,
CBCH replaces sub-slot number 2 of SDCCH channels when enabled.

This change introduces the following CBCH related tasks:

  - MF_TASK_SDCCH4_CBCH (CBCH on C0/TS0 SDCCH/4),
  - MF_TASK_SDCCH8_CBCH (CBCH on SDCCH/8),

which are identified using the following Osmocom specific cbits:

  - MF_TASK_SDCCH4_CBCH - 0x18 (0b11000),
  - MF_TASK_SDCCH8_CBCH - 0x19 (0b11001).

The only way to enable these tasks at the moment is to send
L1CTL_DM_EST_REQ message with required cbits and tn.

Change-Id: I1d7f02cba1cd8f6527360589d2d2747b6426f78b
2018-10-03 08:37:11 +00:00
Vadim Yanitskiy 087626042e firmware/layer1: inform about unhandled scheduler tasks
The mframe_task2chan_nr() is used to get the channel number
(encoded according to 08.58 Chapter 9.3.1) corresponding to
a given multi-frame task type.

It makes sense to at least print some debug message in cases
when there is no matching channel number for a given task type.

Change-Id: I34587b6c67015513de35d85a7a3291f452ee7f3b
2018-10-03 08:37:11 +00:00
Vadim Yanitskiy 05d88069d4 trx_toolkit/fake_trx: drop Timing Advance range limitation
Despite the correct range of Timing Advance value is [0..63],
there is a special feature in OsmocomBB which allows one to
simulate the distance between both MS and a BTS by playing
with the signal delay.

So, let's drop the range limitation.

Change-Id: I8fd2a2ab7784b38bde5ebcfd0359b7e2cb53f5a7
2018-09-07 09:02:19 +00:00
Vadim Yanitskiy f6ea84f774 firmware/l23_api.c: cosmetic: use proper format specifier
The '%u' format specifier should be used for unsigned values.

Change-Id: I1108c34e864304126e581d30b75bbd95b93f60b8
2018-09-06 20:33:23 +00:00
Vadim Yanitskiy a50d3fff72 trx_toolkit/fake_trx: introduce basic path loss simulation
This change introduces a couple of new CTRL commands for path loss
simulation, in particular a possibility to drop some amount of
bursts according to some TDMA frame period, separately for both
Uplink and Downlink directions.

Examples:

  FAKE_DROP 4 - drop 4 consistent (period=1) bursts,
  FAKE_DROP 16 2 - drop 16 even bursts (period=2).

Change-Id: Ib210138a03e2377c79875a4ff2f2bb58a43cfa46
Related: OS#3428
2018-08-02 05:30:49 +07:00
Vadim Yanitskiy b914cfd488 trx_toolkit/burst_fwd.py: separate burst preprocessing
This change separates burst preprocessing (i.e. both RSSI and ToA
calculation) from BurstForwarder.transform_msg() because it's not
actually related to the message transformation process.

Change-Id: Ia7ad970593f38d9a9401975eb6dae67cd0c94e11
2018-08-02 03:50:57 +07:00
Vadim Yanitskiy fd33dcc202 trx_toolkit/trx_sniff.py: fix memleak: don't store packets
The Scapy itself was the actual cause of continuously growing
memory consumption. It was configured to store the captured
packets, what isn't required for this tool.

Change-Id: I0c6d9b76398e148b7febd94aa37aa2fa22d19b3f
2018-07-21 00:14:58 +07:00
Pau Espin c36dc29632 calypso: Print warning about unsupported encryption algorithms
Unfortunately current code architecture doesn't support a return path
with an error so tell the caller of L1CTL on the other side that
something's wrong.

Change-Id: Ib9b622dd5c9770c5e97fa58deee124a409544d3b
2018-07-06 19:11:00 +02:00
Steve Markgraf e9e757f8f3 trf6151: Actually fix setting of uplink ARFCN
Some time ago a broken fix was committed which
then has been reverted again in commit
1724003737.

The purpose of this line is to clear the uplink
flag from the ARFCN. So far this worked because
both gsm_arfcn2band() and gsm_arfcn2freq10()
already do this internally.

Change-Id: Ie8a05ffc0ddec53d7fd6a25e03ea285fb216df29
Signed-off-by: Steve Markgraf <steve@steve-m.de>
2018-06-08 23:58:29 +02:00
Harald Welte 05d95a46fd Merge 'fixeria/trx' into master
Change-Id: I5586fd8c9eb281285f4a59e63cb17dbc3641e1c1
2018-04-07 19:35:24 +02:00
Pau Espin 55afe0072b trx_toolkit: Add cmdline arg to set bind addr
Previous hardcoded default of 0.0.0.0 was inappropiate in some
scenarios, as it sets the SRC addr of the packets sent through the
socket based on the routing.

For instance, if iface IF1 has assigned two IP addresses A and B,
A being the first addr of the interface, and osmo-bts-trx is
configured with "osmotrx ip local A" and "osmotrx ip remote B",
the following happens:

  CMD POWER OFF src=A:5801 dst=B:5701
  RSP POWER OFF src=A:5701 dst=A:5701 <-- A is assigned as src addr.

But osmo-bts-trx is waiting for packets from B:5701, and the packet
is dropped with ICMP Unreachable. If addr binding is forced in
fake_trx to B, then everthing's fine.

Let's extend the UDPLink in order to allow manual, but optional
setting of bind address, and add a corresponding cmdline
argument to all executables.

Change-Id: I7be18fef40967fb7551f4115f22cbbd9cdb0840d
2018-04-04 17:14:26 +00:00
Vadim Yanitskiy d49a748cbb common/l1ctl.c move TCH bit-ordering to the firmware
Previously, TCH frames coming from L1 were reordered to the RTP
format. Moreover, the implementation had a few problems:

  - L1CTL is not the best place for such manipulations;
  - payloads with other than FR codec were corrupted.

Let's use RTP-ordered payloads on the L1CTL interface,
performing TCH frame reordering at the firmware.

Please note, that actual FR reordering was moved to the firmware
as is, without any codec determination. This could be fixed in
a separate change.

Change-Id: I81ec8ed3c9e72a62b22c1720c299cdc68b733cf1
2018-03-14 22:22:43 +07:00
Vadim Yanitskiy a4d255269a 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: I5fab079907c5276322d3ec2b46cab81f10c7ed09
2018-03-14 22:22:39 +07:00
Vadim Yanitskiy 23914b9cf8 Rename 'fake_trx' to 'trx_toolkit'
This toolkit has branched out into several different tools for
TRX interface hacking, and creating a virtual Um-interface
(FakeTRX) is only one of its potential applications.

Change-Id: I56bcbc76b9c273d6b469a2bb68ddc46f3980e835
2018-03-13 02:10:02 +07:00
Vadim Yanitskiy c08ddc7383 fake_trx: unify the GPL license header
There is no need to manually put the license header as a variable
in each application in order to print it. Let's use a common one.

Change-Id: I1a6e8716a9069e7ade3ae15f2c04fd45d18e223c
2018-03-13 02:08:29 +07:00
Vadim Yanitskiy 7fd8ef2d3f fake_trx/ctrl_cmd.py: use a random bind port by default
Since it is not required to specify a bind port to the UDPLink
constructor manually, let's use a random one by default, and
also allow user to set it from command line.

Change-Id: Ib4965ebeec83d9a99b2f026156eb5f5cb20875bf
2018-03-06 22:54:21 +07:00
Vadim Yanitskiy 2812cb7f80 fake_trx/udp_link.py: use a random bind port by default
This allows one to obtain a random available port from the
OS, instead of enforcing to pick a static value manually.

Change-Id: Ie8b60134239c5447d0b4373c6cca2f3a6ee3ec73
2018-03-06 22:53:28 +07:00
Vadim Yanitskiy c20f9bb5cd fake_trx/ctrl_if.py: remove incorrect isdigit() check
Previously, we used to check if all arguments of a command are
numeric. This was done in a wrong way, so parsing a *valid*
command with at least one negative argument could fail.

Let's remove this check, allowing the command handlers to
deal with argument types themselves.

Change-Id: If31295274a09102c414b5a7aec5dd85d88b2e514
2018-03-06 02:28:37 +07:00
Vadim Yanitskiy 59d054906d fake_trx/ctrl_if.py: reduce code branch nasting
Let's use the inverted condition to avoid additional code nasting.

Change-Id: I8a62b39d9d9a597c612f9a576e98dc05e37cd25b
2018-03-06 02:28:37 +07:00
Vadim Yanitskiy f97e3cd788 fake_trx/ctrl_if.py: remove forgotten debug print
Change-Id: I4886828fb0f927c59c5eb1945a3c2873687de7b3
2018-03-06 02:28:37 +07:00
Harald Welte ff233256e1 fake_trx/ctrl_if_(bb|bts).py: log link info at start-up
Change-Id: I4ebeed7271d91ab2e45199e0fb59776c00ad833c
2018-03-02 05:04:59 +07:00
Harald Welte 380dc7e768 fake_trx: Increase TOA256 value ranges
In theory, the maximum TA value is 63 symbols, i.e. 63*256 in this
context.  However, our test cases want to test the BTS behavior is
correct if ever a larger timing offset is reported from TRX to the BTS,
to ensure it is rejected in the BTS.  Let's hence increase the values
to rather large min/max limits.  We could also remove them completely.

Change-Id: I691d081256e8c6d18ef2836299ed8f7d502da3ee
2018-03-01 11:50:22 +01:00
Harald Welte cc447afe34 fake_trx: Send positive response to FAKE_TOA commands
Now that ctrl_if.py is capable of sending back the response to where
the command originated from, we can just as well send a positive
response back after executing the related commands.

Change-Id: Icba138835149a7264f4db3a6b05f54ca501c4d54
2018-03-01 11:49:15 +01:00
Harald Welte 4e74311b00 fake_trx: Always send control responses to where commands are from
fake_trx is using locally bound and not connected UDP sockets for
control commands.

When we receive a control command, we should not simply send the
response to the default destination, but send it back to the exact
ip+prt from which the command originated.  This ensures correct routing
of responses even in case multiple programs are interfacing concurrently
with a control socket.

Change-Id: I24a0bba6eed059b101af95dac7d059f34dd715fc
2018-03-01 11:49:15 +01:00
Vadim Yanitskiy 6fa80f274e fake_trx/burst_fwd.py: FIX: apply TA value correctly
If field randomization is disabled, Timing Advance value
indicated by MS would be ignored. Let's fix this by
separating the TA calculation code.

Change-Id: If43d5823fc33efc2f1649ea941ab6f619bb6f5e7
2018-03-01 01:52:04 +07:00
Harald Welte 5ab622d2b7 fake_trx/ctrl_if_(bb|bts).py: add FAKE_TOA command
FAKE_TOA is an auxilary CTRL command, which may be used to update
the ToA (Timing of Arrival) value of forwarded bursts at runtime.
This is useful for testing the measurement processing
code in OsmoBTS.

The command is implemented for both BTS and BB CTRL interfaces
in two absolute and relative forms:

  CMD FAKE_TOA <BASE> <THRESH>
  CMD FAKE_TOA <+-BASE_DELTA>

The first form overwrites both ToA value and its treshold.
The second one is relative, and applies a delta
to the current ToA value.

The command affects Downlink bursts if sent on BTS CTRL
interface, and Uplink bursts if sent on the BB CTRL.

Change-Id: Ia23becec4104d47e7b22350db67b8834d6f1ad1b
2018-03-01 00:17:24 +07:00
Vadim Yanitskiy 7de70009f6 fake_trx/fake_trx.py: add options to enable field randomization
By default, both RSSI and ToA fields randomization is disabled.
Let's add command line options, which allow one to enable it.

Change-Id: Ieac63cc3aadef397906479a6179ba54a53a5311a
2018-02-28 22:39:01 +07:00
Vadim Yanitskiy 81896a8328 fake_trx/burst_fwd.py: disable field randomization by default
Both RSSI and ToA fields randomization is only required in some
specific test / use cases, so let's disable it by default.

Change-Id: I94835a840b6239f2c05197292825cb26977d0216
2018-02-28 22:37:41 +07:00
Vadim Yanitskiy 3da6166111 fake_trx/burst_fwd.py: calculate both RSSI and ToA separately
In order to be able to simulate and randomize both RSSI and ToA
values for Uplink and Downlink separately, let's calculate them
in separate methods of the BurstForwarder.

Change-Id: Ia2031f22f2b549c799c782d0c8c8d0691fb6f18c
2018-02-28 22:36:53 +07:00
Vadim Yanitskiy f09989b1fb fake_trx: handle SETTA (Timing Advance) indicated by MS
Timing Advance value is a timing correction value, indicated by
the network to MS, which is used to compensate UL signal delay.
In other words, the network instructs a phone to transmit bursts
N=TA symbol periods earlier than expected.

Since we are in virtual environment, let's use TA value to
calculate the ToA (Timing of Arrival) value for BTS.

Change-Id: Ie5833a9f221587bbcac10f0b223ead9c1cbda72b
2018-02-28 22:34:36 +07:00
Vadim Yanitskiy d9cb065417 fake_trx/data_msg.py: implement ToA parsing support
This change implements ToA (Timing of Arrival) parsing, which
was missing in the DATAMSG_TRX2L1. Since we use integer math,
a ToA value is represented in units of 1/256 symbol periods.

Change-Id: Ib11482c06b977c4cf01b0644f5845a2e49d059fb
2018-02-28 22:34:27 +07:00
Vadim Yanitskiy 9fc30a4102 fake_trx/data_msg.py: use integer math for ToA
In order to avoid both float arithmetic as well as loosing any
precision, let's use integer math fot ToA (Timing of Arrival),
i.e. let's express ToA values in units of 1/256 symbol periods.

Change-Id: I56b88740f4d782ac7591fc096d1969514784a4e1
2018-02-28 22:33:35 +07:00
Vadim Yanitskiy cbd3d76df9 fake_trx/burst_fwd.py: drop useless set_slot() method
Change-Id: I721c87758f04a1962427341eb1b2d47cfdd3f780
2018-02-28 22:33:35 +07:00
Vadim Yanitskiy 7881fd6001 fake_trx/data_msg.py: use a single unified constructor
There are no message specific initialization parts, excepting
the header specific fields setting. Let's us a common constructor,
dropping custom fields from its arguments.

Change-Id: I13a3e4b2f6a1f443ebe7d809df62736e3c43f56f
2018-02-28 15:18:16 +07:00
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
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 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
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
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 0b5231bdb4 common/l1ctl.c move TCH bit-ordering to the firmware
Previously, TCH frames coming from L1 were reordered to the RTP
format. Moreover, the implementation had a few problems:

  - L1CTL is not the best place for such manipulations;
  - payloads with other than FR codec were corrupted.

Let's use RTP-ordered payloads on the L1CTL interface,
performing TCH frame reordering at the firmware.

Please note, that actual FR reordering was moved to the firmware
as is, without any codec determination. This could be fixed in
a separate change.

Change-Id: I235a9f535c39d8e57f5d2c6566daeaf883aeef9e
2017-12-16 15:45:17 +07:00
Vadim Yanitskiy af217395cc fake_trx: don't sent clock indications until POWERON
Change-Id: I86ccc9d26fc54e6511f74f858afdaebb2b284c19
2017-12-09 01:25:52 +07:00
Vadim Yanitskiy 26ecb9460e fake_trx/clck_gen.py: reset the clck_src when calling stop()
Change-Id: I1043f71a2cbe856a0cb605db8a7feab9defa6afd
2017-12-09 01:24:05 +07:00
Vadim Yanitskiy 05ff6b0667 fake_trx/clck_gen.py: send the first indication immediately
Change-Id: I0132dd939b02db357d248abf65c9116d6a1802d0
2017-12-09 01:22:24 +07:00
Craig Comstock 2cac7e8cef target/firmware: fix Mediatek firmware compilation
The existing Makefile.mtk isn't compatible with the current
Makefile scheme, so nothing would happen when it was called.

This change updates the Makefile.mtk, so the Mediatek firmware
can be successfully compiled again.

Change-Id: Iecd619ed862f4d825095292ffde50544e647f6ff
2017-12-07 09:06:32 +07:00
Vadim Yanitskiy 04aecc7f8d fake_trx: correct brief descriptions of files
Change-Id: Ie76fee4a567681a5380be90e5744621c2aa3e5f0
2017-11-21 18:39:11 +07:00
Vadim Yanitskiy eb56da3743 fake_trx: implement a new tool for burst sending
This change introduces a new tool for sending existing bursts from
file or standard input either to L1 (OsmoBTS or OsmocomBB) or to
TRX (OsmoTRX and GR-GSM TRX).

Change-Id: I2c542583252d31daac466e6c7837317fda8a7020
2017-11-21 18:25:48 +07:00
Vadim Yanitskiy 3a395740d3 fake_trx/burst_gen.py: remove unused import
Change-Id: I407877e2025663f706d1a2f93e6228770bfc253c
2017-11-21 17:42:51 +07:00
Vadim Yanitskiy 826c515f4e fake_trx/README: correct the branch name
Change-Id: I9d65580570d9bced65a7bcc95ca073ecc3e130e5
2017-11-21 17:42:19 +07:00
Vadim Yanitskiy be7825d983 fake_trx/ctrl_cmd.py: add help and basic command line options
Sometimes it's important to use different CTRL port, for example
when OsmoTRX is running at the same time. This change adds the
corresponding command line options and help message.

Change-Id: Ic6eeb69d9a1fc151eab2e63f3708e3d70e2e558b
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy f28f0d343f fake_trx: whitespace fix
Change-Id: Iad2be36777e4a2454e181c856c7902574a4ab20c
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy a59edfbd40 fake_trx: separate DataInterface from burst_gen.py
Change-Id: I325cf2ae59ef8834c2ddfb67206eede44d1e0acf
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy 1e9501671a fake_trx: add options to specify fn, tn and pwr
Change-Id: Ifd4f4864707596a69fece11218a4800b98551c31
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy 539e9a1f18 fake_trx: add a new tool for burst generation
This change introduces a new tool named 'burst_gen.py'. One can
be used for sending GSM bursts either to L1 (OsmoBTS or OsmocomBB)
or to TRX (OsmoTRX and GR-GSM TRX). Currently it is only possible
to send random bursts of different types: NB, FB, SB, AB.

Change-Id: Ie14281222d29536b8690517e57af2a1007fcbc91
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy d497bc8288 fake_trx: add copyright message to clck_gen.py and ctrl_cmd.py
Change-Id: Ia79279dd9e85d131d66d790f1f3fd64fb1914f58
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy 4fa6694006 fake_trx: don't send clock indications to mobile stations
Clock indications are only required for BTS, while MS can
obtain current frame number from messages on DATA interface.

Change-Id: Id2993847a3581cac0d355850ad09ceabc6116d3f
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy 538bea917b fake_trx: fix compatibility with Python 3
Change-Id: Idce0c631aa3fcd20092a3773558570e442b2fec8
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy 87e5f67f66 fake_trx: implement simple freq. filter
Change-Id: Ifbeaebeaf68a88c07a05b672502f503ab7b890f2
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy b4da181c39 fake_trx: handle SETSLOT command from BB
Change-Id: I152486377ecd6777dbae7024e5d12cfdbcb17628
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy 02996abeda fake_trx: implement power measurement emulation
This change introduces a new class named FakePM, which is intended
to generate pseudo-random power levels for base stations and noise
levels inactive frequencies.

Also, there is a new command in BB CTRL, which instructs transceiver
to perform a power measurement on requested frequency. As we work in
virtual Um-interface, a FakePM instance is used to provide some fake
power levels.

Change-Id: If48c12fd0b1ba10e1cf76559b359e17a1256617d
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy e39bb0f0d1 fake_trx/ctrl_if.py: allow adding custom params to response
Change-Id: I551bb425c25a5c978801d9e1e033b4ba352e259f
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy ef31f1bff2 fake_trx/ctrl_cmd.py: print response to stdout
Change-Id: Icdbb1802b81eddf42786fafcf96200a60db3cc24
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy 798e2b148c fake_trx: fix copy-paste error
Change-Id: I9a6b294ad3501aa26d92667a995d08ca3be03da4
2017-11-19 17:35:07 +07:00
Vadim Yanitskiy a692cacdfc fake_trx/burst_fwd.py: append two unused bytes at the end
Change-Id: I1d7ed076d93b37699520ee2a31c42c177f966865
2017-11-19 17:35:07 +07:00