Revert "trx_toolkit/transceiver.py: implement the transmit burst queue"
This reverts commit 6e1c82d298
.
Unfortunately, solving one problem it introduced even more regressions.
Change-Id: If29b4f6718cbc8af18fe18a5e3eca3912e8af01e
Related: OS#4658
This commit is contained in:
parent
7eb355ab3e
commit
d4ed09df57
|
@ -388,8 +388,6 @@ class Application(ApplicationBase):
|
||||||
|
|
||||||
# Init shared clock generator
|
# Init shared clock generator
|
||||||
self.clck_gen = CLCKGen([])
|
self.clck_gen = CLCKGen([])
|
||||||
# This method will be called on each TDMA frame
|
|
||||||
self.clck_gen.clck_handler = self.clck_handler
|
|
||||||
|
|
||||||
# Power measurement emulation
|
# Power measurement emulation
|
||||||
# Noise: -120 .. -105
|
# Noise: -120 .. -105
|
||||||
|
@ -458,18 +456,14 @@ class Application(ApplicationBase):
|
||||||
for trx in self.trx_list.trx_list:
|
for trx in self.trx_list.trx_list:
|
||||||
# DATA interface
|
# DATA interface
|
||||||
if trx.data_if.sock in r_event:
|
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
|
# CTRL interface
|
||||||
if trx.ctrl_if.sock in r_event:
|
if trx.ctrl_if.sock in r_event:
|
||||||
trx.ctrl_if.handle_rx()
|
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):
|
def shutdown(self):
|
||||||
log.info("Shutting down...")
|
log.info("Shutting down...")
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@
|
||||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
import logging as log
|
import logging as log
|
||||||
import threading
|
|
||||||
|
|
||||||
from ctrl_if_trx import CTRLInterfaceTRX
|
from ctrl_if_trx import CTRLInterfaceTRX
|
||||||
from data_if import DATAInterface
|
from data_if import DATAInterface
|
||||||
|
@ -123,37 +122,6 @@ class Transceiver:
|
||||||
Transceiver and all its timeslots, so using in for the BTS side
|
Transceiver and all its timeslots, so using in for the BTS side
|
||||||
does not make any sense (imagine BCCH hopping together with DCCH).
|
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,
|
def __init__(self, bind_addr, remote_addr, base_port, name = None,
|
||||||
|
@ -209,10 +177,6 @@ class Transceiver:
|
||||||
# List of child transceivers
|
# List of child transceivers
|
||||||
self.child_trx_list = TRXList()
|
self.child_trx_list = TRXList()
|
||||||
|
|
||||||
# Tx (L12TRX) burst queue and mutex
|
|
||||||
self._tx_queue_lock = threading.Lock()
|
|
||||||
self._tx_queue = []
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
desc = "%s:%d" % (self.remote_addr, self.base_port)
|
desc = "%s:%d" % (self.remote_addr, self.base_port)
|
||||||
if self.child_idx > 0:
|
if self.child_idx > 0:
|
||||||
|
@ -269,12 +233,10 @@ class Transceiver:
|
||||||
trx.running = True
|
trx.running = True
|
||||||
elif event == "POWEROFF":
|
elif event == "POWEROFF":
|
||||||
trx.running = False
|
trx.running = False
|
||||||
trx.tx_queue_clear()
|
|
||||||
trx.disable_fh()
|
trx.disable_fh()
|
||||||
|
|
||||||
# Reset frequency hopping parameters, clear the queue
|
# Reset frequency hopping parameters
|
||||||
if event == "POWEROFF":
|
if event == "POWEROFF":
|
||||||
self.tx_queue_clear()
|
|
||||||
self.disable_fh()
|
self.disable_fh()
|
||||||
|
|
||||||
# Trigger clock generator if required
|
# Trigger clock generator if required
|
||||||
|
@ -312,34 +274,8 @@ class Transceiver:
|
||||||
"configured => dropping..." % (self, msg.desc_hdr()))
|
"configured => dropping..." % (self, msg.desc_hdr()))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# Enque the message, it will be sent later
|
|
||||||
self.tx_queue_append(msg)
|
|
||||||
return msg
|
return msg
|
||||||
|
|
||||||
def handle_data_msg(self, msg):
|
def handle_data_msg(self, msg):
|
||||||
# TODO: make legacy mode configurable (via argv?)
|
# TODO: make legacy mode configurable (via argv?)
|
||||||
self.data_if.send_msg(msg, legacy = True)
|
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()
|
|
||||||
|
|
Loading…
Reference in New Issue