<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12325">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit/fake_trx.py: handle multiple transceivers<br><br>Change-Id: Ibff31fb3a958a714c828d0dea7e87d47f778fd80<br>---<br>M src/target/trx_toolkit/fake_trx.py<br>1 file changed, 63 insertions(+), 31 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/25/12325/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/fake_trx.py b/src/target/trx_toolkit/fake_trx.py</span><br><span>index 733cc10..421f587 100755</span><br><span>--- a/src/target/trx_toolkit/fake_trx.py</span><br><span>+++ b/src/target/trx_toolkit/fake_trx.py</span><br><span>@@ -302,51 +302,62 @@</span><br><span>             # BTS: -75 .. -50</span><br><span>            self.fake_pm = FakePM(-120, -105, -75, -50)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               # List of all transceivers</span><br><span style="color: hsl(120, 100%, 40%);">+            self.trx_list = []</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                 # Init TRX instance for BTS</span><br><span style="color: hsl(0, 100%, 40%);">-             self.bts_trx = FakeTRX(self.argv.trx_bind_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                 self.argv.bts_addr, self.argv.bts_base_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                    self.clck_gen)</span><br><span style="color: hsl(120, 100%, 40%);">+                trx = FakeTRX(self.argv.trx_bind_addr, self.argv.bts_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                    self.argv.bts_base_port, self.clck_gen)</span><br><span style="color: hsl(120, 100%, 40%);">+               self.trx_list.append(trx)</span><br><span> </span><br><span>                # Init TRX instance for BB</span><br><span>           # NOTE: trxcon doesn't need clock</span><br><span style="color: hsl(0, 100%, 40%);">-           self.bb_trx = FakeTRXBB(self.fake_pm,</span><br><span style="color: hsl(0, 100%, 40%);">-                   self.argv.trx_bind_addr, self.argv.bb_addr,</span><br><span style="color: hsl(0, 100%, 40%);">-                     self.argv.bb_base_port)</span><br><span style="color: hsl(120, 100%, 40%);">+               trx = FakeTRXBB(self.fake_pm, self.argv.trx_bind_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                        self.argv.bb_addr, self.argv.bb_base_port)</span><br><span style="color: hsl(120, 100%, 40%);">+            self.trx_list.append(trx)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           # Optional BTS transceivers</span><br><span style="color: hsl(120, 100%, 40%);">+           if self.argv.bts_trx_list is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                        for (remote_addr, base_port) in self.argv.bts_trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                               trx = FakeTRX(self.argv.trx_bind_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        remote_addr, base_port)</span><br><span style="color: hsl(120, 100%, 40%);">+                               self.trx_list.append(trx)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           # Optional BB transceivers</span><br><span style="color: hsl(120, 100%, 40%);">+            if self.argv.bb_trx_list is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                 for (remote_addr, base_port) in self.argv.bb_trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                                trx = FakeTRXBB(self.fake_pm,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 self.argv.trx_bind_addr,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      remote_addr, base_port)</span><br><span style="color: hsl(120, 100%, 40%);">+                               self.trx_list.append(trx)</span><br><span> </span><br><span>                # Burst forwarding between transceivers</span><br><span style="color: hsl(0, 100%, 40%);">-         self.burst_fwd = BurstForwarder()</span><br><span style="color: hsl(0, 100%, 40%);">-               self.burst_fwd.add_trx(self.bts_trx)</span><br><span style="color: hsl(0, 100%, 40%);">-            self.burst_fwd.add_trx(self.bb_trx)</span><br><span style="color: hsl(120, 100%, 40%);">+           self.burst_fwd = BurstForwarder(self.trx_list)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              # Compose list of to be monitored sockets</span><br><span style="color: hsl(120, 100%, 40%);">+             self.sock_list = []</span><br><span style="color: hsl(120, 100%, 40%);">+           for trx in self.trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.sock_list.append(trx.ctrl_if.sock)</span><br><span style="color: hsl(120, 100%, 40%);">+                       self.sock_list.append(trx.data_if.sock)</span><br><span> </span><br><span>          log.info("Init complete")</span><br><span> </span><br><span>              # Enter main loop</span><br><span>            while True:</span><br><span style="color: hsl(0, 100%, 40%);">-                     socks = [self.bts_trx.ctrl_if.sock, self.bb_trx.ctrl_if.sock,</span><br><span style="color: hsl(0, 100%, 40%);">-                           self.bts_trx.data_if.sock, self.bb_trx.data_if.sock]</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>                         # Wait until we get any data on any socket</span><br><span style="color: hsl(0, 100%, 40%);">-                      r_event, w_event, x_event = select.select(socks, [], [])</span><br><span style="color: hsl(120, 100%, 40%);">+                      r_event, _, _ = select.select(self.sock_list, [], [])</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                       # Downlink: BTS -> BB</span><br><span style="color: hsl(0, 100%, 40%);">-                        if self.bts_trx.data_if.sock in r_event:</span><br><span style="color: hsl(0, 100%, 40%);">-                                msg = self.bts_trx.recv_data_msg()</span><br><span style="color: hsl(0, 100%, 40%);">-                              if msg is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                                     self.burst_fwd.forward_msg(self.bts_trx, msg)</span><br><span style="color: hsl(120, 100%, 40%);">+                 # Iterate over all transceivers</span><br><span style="color: hsl(120, 100%, 40%);">+                       for trx in self.trx_list:</span><br><span style="color: hsl(120, 100%, 40%);">+                             # DATA interface</span><br><span style="color: hsl(120, 100%, 40%);">+                              if trx.data_if.sock in r_event:</span><br><span style="color: hsl(120, 100%, 40%);">+                                       msg = trx.recv_data_msg()</span><br><span style="color: hsl(120, 100%, 40%);">+                                     if msg is not None:</span><br><span style="color: hsl(120, 100%, 40%);">+                                           self.burst_fwd.forward_msg(trx, msg)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                        # Uplink: BB -> BTS</span><br><span style="color: hsl(0, 100%, 40%);">-                  if self.bb_trx.data_if.sock in r_event:</span><br><span style="color: hsl(0, 100%, 40%);">-                         msg = self.bb_trx.recv_data_msg()</span><br><span style="color: hsl(0, 100%, 40%);">-                               if msg is not None:</span><br><span style="color: hsl(0, 100%, 40%);">-                                     self.burst_fwd.forward_msg(self.bb_trx, msg)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                    # CTRL commands from BTS</span><br><span style="color: hsl(0, 100%, 40%);">-                        if self.bts_trx.ctrl_if.sock in r_event:</span><br><span style="color: hsl(0, 100%, 40%);">-                                self.bts_trx.ctrl_if.handle_rx()</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                        # CTRL commands from BB</span><br><span style="color: hsl(0, 100%, 40%);">-                 if self.bb_trx.ctrl_if.sock in r_event:</span><br><span style="color: hsl(0, 100%, 40%);">-                         self.bb_trx.ctrl_if.handle_rx()</span><br><span style="color: hsl(120, 100%, 40%);">+                               # CTRL interface</span><br><span style="color: hsl(120, 100%, 40%);">+                              if trx.ctrl_if.sock in r_event:</span><br><span style="color: hsl(120, 100%, 40%);">+                                       trx.ctrl_if.handle_rx()</span><br><span> </span><br><span>  def shutdown(self):</span><br><span>          log.info("Shutting down...")</span><br><span>@@ -354,6 +365,16 @@</span><br><span>                # Stop clock generator</span><br><span>               self.clck_gen.stop()</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      @staticmethod</span><br><span style="color: hsl(120, 100%, 40%);">+ def trx_def(val):</span><br><span style="color: hsl(120, 100%, 40%);">+             try:</span><br><span style="color: hsl(120, 100%, 40%);">+                  # e.g. 127.0.0.1:5700</span><br><span style="color: hsl(120, 100%, 40%);">+                 trx = val.split(":")</span><br><span style="color: hsl(120, 100%, 40%);">+                        addr, port = trx[0], int(trx[1])</span><br><span style="color: hsl(120, 100%, 40%);">+                      return (addr, port)</span><br><span style="color: hsl(120, 100%, 40%);">+           except:</span><br><span style="color: hsl(120, 100%, 40%);">+                       raise argparse.ArgumentTypeError("Invalid TRX definition: %s" % val)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     def parse_argv(self):</span><br><span>                parser = argparse.ArgumentParser(prog = "fake_trx",</span><br><span>                        description = "Virtual Um-interface (fake transceiver)")</span><br><span>@@ -378,8 +399,19 @@</span><br><span>                    dest = "bb_base_port", type = int, default = 6700,</span><br><span>                         help = "Set BB base port number (default %(default)s)")</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+         mtrx_group = parser.add_argument_group("Additional transceivers")</span><br><span style="color: hsl(120, 100%, 40%);">+           mtrx_group.add_argument("--bts-trx", metavar = "REMOTE_ADDR:BASE_PORT",</span><br><span style="color: hsl(120, 100%, 40%);">+                   dest = "bts_trx_list", type = self.trx_def, action = "append",</span><br><span style="color: hsl(120, 100%, 40%);">+                    help = "Add a transceiver for BTS (e.g. 127.0.0.1:5703)")</span><br><span style="color: hsl(120, 100%, 40%);">+           mtrx_group.add_argument("--bb-trx", metavar = "REMOTE_ADDR:BASE_PORT",</span><br><span style="color: hsl(120, 100%, 40%);">+                    dest = "bb_trx_list", type = self.trx_def, action = "append",</span><br><span style="color: hsl(120, 100%, 40%);">+                     help = "Add a transceiver for BB (e.g. 127.0.0.1:6703)")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                 argv = parser.parse_args()</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                # TODO: make sure there are no duplicates in both</span><br><span style="color: hsl(120, 100%, 40%);">+             # bts_trx_list and bb_trx_list</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>             # Make sure there is no overlap between ports</span><br><span>                if argv.bts_base_port == argv.bb_base_port:</span><br><span>                  parser.error("BTS and BB base ports shall be different")</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12325">change 12325</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/12325"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ibff31fb3a958a714c828d0dea7e87d47f778fd80 </div>
<div style="display:none"> Gerrit-Change-Number: 12325 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>