summaryrefslogtreecommitdiffstats
path: root/src/target
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-07-21 16:12:02 +0700
committerVadim Yanitskiy <vyanitskiy@sysmocom.de>2020-07-22 19:59:06 +0700
commitd4ed09df57b3461470af501e9687ddd80eb78838 (patch)
tree82b51c30b67e7f9fe4ab0a9dea8c1177bbb4763c /src/target
parent7eb355ab3ee1f3566a2e9b7c3ade05ec27148c45 (diff)
Revert "trx_toolkit/transceiver.py: implement the transmit burst queue"
This reverts commit 6e1c82d29836496b20e0d826976d9e71b32493d8. Unfortunately, solving one problem it introduced even more regressions. Change-Id: If29b4f6718cbc8af18fe18a5e3eca3912e8af01e Related: OS#4658
Diffstat (limited to 'src/target')
-rwxr-xr-xsrc/target/trx_toolkit/fake_trx.py12
-rw-r--r--src/target/trx_toolkit/transceiver.py66
2 files changed, 4 insertions, 74 deletions
diff --git a/src/target/trx_toolkit/fake_trx.py b/src/target/trx_toolkit/fake_trx.py
index da611e81..ded8dc4d 100755
--- a/src/target/trx_toolkit/fake_trx.py
+++ b/src/target/trx_toolkit/fake_trx.py
@@ -388,8 +388,6 @@ class Application(ApplicationBase):
# Init shared clock generator
self.clck_gen = CLCKGen([])
- # This method will be called on each TDMA frame
- self.clck_gen.clck_handler = self.clck_handler
# Power measurement emulation
# Noise: -120 .. -105
@@ -458,18 +456,14 @@ class Application(ApplicationBase):
for trx in self.trx_list.trx_list:
# DATA interface
if trx.data_if.sock in r_event:
- trx.recv_data_msg()
+ msg = trx.recv_data_msg()
+ if msg is not None:
+ self.burst_fwd.forward_msg(trx, msg)
# CTRL interface
if trx.ctrl_if.sock in r_event:
trx.ctrl_if.handle_rx()
- # This method will be called by the clock thread
- def clck_handler(self, fn):
- # We assume that this list is immutable at run-time
- for trx in self.trx_list.trx_list:
- trx.clck_tick(self.burst_fwd, fn)
-
def shutdown(self):
log.info("Shutting down...")
diff --git a/src/target/trx_toolkit/transceiver.py b/src/target/trx_toolkit/transceiver.py
index 9fc2948f..19b998e9 100644
--- a/src/target/trx_toolkit/transceiver.py
+++ b/src/target/trx_toolkit/transceiver.py
@@ -23,7 +23,6 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
import logging as log
-import threading
from ctrl_if_trx import CTRLInterfaceTRX
from data_if import DATAInterface
@@ -123,37 +122,6 @@ class Transceiver:
Transceiver and all its timeslots, so using in for the BTS side
does not make any sense (imagine BCCH hopping together with DCCH).
- == The transmit burst queue
-
- According to 3GPP 45.002, the time difference between Uplink and
- Downlink corresponds to three TDMA timeslot periods. However,
- in general the L1 implementations (such as osmo-bts-trx and trxcon)
- never schedule to be transmitted bursts for the current TDMA frame
- immediately. Instead, they are being scheduled prematurely.
-
- The rationale is that both transceiver and the L1 implementation
- are separete processes that are not perfectly synchronized in time.
- Moreover, the transceiver needs some time to prepare a burst for
- transmission. This is why the time difference between Uplink and
- Downlink is actually much higher on practice (20 TDMA frame periods
- by default, at the moment of writing this patch).
-
- In order to reflect that delay in a virtual environment, this
- implementation, just like a normal transceiver (e.g. osmo-trx),
- queues all to be transmitted (L12TRX) bursts, so hey remain in
- the transmit queue until the appropriate time of transmission.
-
- The API user is supposed to call recv_data_msg() in order to obtain
- a L12TRX message on the TRXD (data) inteface, so it gets queued by
- this function. Then, to ensure the timeous transmission, the user
- of this implementation needs to call clck_tick() on each TDMA
- frame. Both functions are thread-safe (queue mutex).
-
- In a multi-trx configuration, the use of queue additionally ensures
- proper burst aggregation on multiple TRXD connections, so all L12TRX
- messages are guaranteed to be sent in the right order, i.e. with
- monolithically-increasing TDMA frame numbers.
-
"""
def __init__(self, bind_addr, remote_addr, base_port, name = None,
@@ -209,10 +177,6 @@ class Transceiver:
# List of child transceivers
self.child_trx_list = TRXList()
- # Tx (L12TRX) burst queue and mutex
- self._tx_queue_lock = threading.Lock()
- self._tx_queue = []
-
def __str__(self):
desc = "%s:%d" % (self.remote_addr, self.base_port)
if self.child_idx > 0:
@@ -269,12 +233,10 @@ class Transceiver:
trx.running = True
elif event == "POWEROFF":
trx.running = False
- trx.tx_queue_clear()
trx.disable_fh()
- # Reset frequency hopping parameters, clear the queue
+ # Reset frequency hopping parameters
if event == "POWEROFF":
- self.tx_queue_clear()
self.disable_fh()
# Trigger clock generator if required
@@ -312,34 +274,8 @@ class Transceiver:
"configured => dropping..." % (self, msg.desc_hdr()))
return None
- # Enque the message, it will be sent later
- self.tx_queue_append(msg)
return msg
def handle_data_msg(self, msg):
# TODO: make legacy mode configurable (via argv?)
self.data_if.send_msg(msg, legacy = True)
-
- def tx_queue_append(self, msg):
- with self._tx_queue_lock:
- self._tx_queue.append(msg)
-
- def tx_queue_clear(self):
- with self._tx_queue_lock:
- self._tx_queue.clear()
-
- def clck_tick(self, fwd, fn):
- if not self.running:
- return
-
- self._tx_queue_lock.acquire()
-
- for msg in self._tx_queue:
- if msg.fn == fn:
- fwd.forward_msg(self, msg)
- elif msg.fn < fn:
- log.warning("(%s) Stale TRXD message (fn=%u): %s"
- % (self, fn, msg.desc_hdr()))
-
- self._tx_queue = [msg for msg in self._tx_queue if msg.fn > fn]
- self._tx_queue_lock.release()