Vadim Yanitskiy has uploaded this change for review. ( 
https://gerrit.osmocom.org/12325


Change subject: trx_toolkit/fake_trx.py: handle multiple transceivers
......................................................................

trx_toolkit/fake_trx.py: handle multiple transceivers

Change-Id: Ibff31fb3a958a714c828d0dea7e87d47f778fd80
---
M src/target/trx_toolkit/fake_trx.py
1 file changed, 63 insertions(+), 31 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/25/12325/1

diff --git a/src/target/trx_toolkit/fake_trx.py 
b/src/target/trx_toolkit/fake_trx.py
index 733cc10..421f587 100755
--- a/src/target/trx_toolkit/fake_trx.py
+++ b/src/target/trx_toolkit/fake_trx.py
@@ -302,51 +302,62 @@
                # BTS: -75 .. -50
                self.fake_pm = FakePM(-120, -105, -75, -50)

+               # List of all transceivers
+               self.trx_list = []
+
                # Init TRX instance for BTS
-               self.bts_trx = FakeTRX(self.argv.trx_bind_addr,
-                       self.argv.bts_addr, self.argv.bts_base_port,
-                       self.clck_gen)
+               trx = FakeTRX(self.argv.trx_bind_addr, self.argv.bts_addr,
+                       self.argv.bts_base_port, self.clck_gen)
+               self.trx_list.append(trx)

                # Init TRX instance for BB
                # NOTE: trxcon doesn't need clock
-               self.bb_trx = FakeTRXBB(self.fake_pm,
-                       self.argv.trx_bind_addr, self.argv.bb_addr,
-                       self.argv.bb_base_port)
+               trx = FakeTRXBB(self.fake_pm, self.argv.trx_bind_addr,
+                       self.argv.bb_addr, self.argv.bb_base_port)
+               self.trx_list.append(trx)
+
+               # Optional BTS transceivers
+               if self.argv.bts_trx_list is not None:
+                       for (remote_addr, base_port) in self.argv.bts_trx_list:
+                               trx = FakeTRX(self.argv.trx_bind_addr,
+                                       remote_addr, base_port)
+                               self.trx_list.append(trx)
+
+               # Optional BB transceivers
+               if self.argv.bb_trx_list is not None:
+                       for (remote_addr, base_port) in self.argv.bb_trx_list:
+                               trx = FakeTRXBB(self.fake_pm,
+                                       self.argv.trx_bind_addr,
+                                       remote_addr, base_port)
+                               self.trx_list.append(trx)

                # Burst forwarding between transceivers
-               self.burst_fwd = BurstForwarder()
-               self.burst_fwd.add_trx(self.bts_trx)
-               self.burst_fwd.add_trx(self.bb_trx)
+               self.burst_fwd = BurstForwarder(self.trx_list)
+
+               # Compose list of to be monitored sockets
+               self.sock_list = []
+               for trx in self.trx_list:
+                       self.sock_list.append(trx.ctrl_if.sock)
+                       self.sock_list.append(trx.data_if.sock)

                log.info("Init complete")

                # Enter main loop
                while True:
-                       socks = [self.bts_trx.ctrl_if.sock, 
self.bb_trx.ctrl_if.sock,
-                               self.bts_trx.data_if.sock, 
self.bb_trx.data_if.sock]
-
                        # Wait until we get any data on any socket
-                       r_event, w_event, x_event = select.select(socks, [], [])
+                       r_event, _, _ = select.select(self.sock_list, [], [])

-                       # Downlink: BTS -> BB
-                       if self.bts_trx.data_if.sock in r_event:
-                               msg = self.bts_trx.recv_data_msg()
-                               if msg is not None:
-                                       
self.burst_fwd.forward_msg(self.bts_trx, msg)
+                       # Iterate over all transceivers
+                       for trx in self.trx_list:
+                               # DATA interface
+                               if trx.data_if.sock in r_event:
+                                       msg = trx.recv_data_msg()
+                                       if msg is not None:
+                                               self.burst_fwd.forward_msg(trx, 
msg)

-                       # Uplink: BB -> BTS
-                       if self.bb_trx.data_if.sock in r_event:
-                               msg = self.bb_trx.recv_data_msg()
-                               if msg is not None:
-                                       self.burst_fwd.forward_msg(self.bb_trx, 
msg)
-
-                       # CTRL commands from BTS
-                       if self.bts_trx.ctrl_if.sock in r_event:
-                               self.bts_trx.ctrl_if.handle_rx()
-
-                       # CTRL commands from BB
-                       if self.bb_trx.ctrl_if.sock in r_event:
-                               self.bb_trx.ctrl_if.handle_rx()
+                               # CTRL interface
+                               if trx.ctrl_if.sock in r_event:
+                                       trx.ctrl_if.handle_rx()

        def shutdown(self):
                log.info("Shutting down...")
@@ -354,6 +365,16 @@
                # Stop clock generator
                self.clck_gen.stop()

+       @staticmethod
+       def trx_def(val):
+               try:
+                       # e.g. 127.0.0.1:5700
+                       trx = val.split(":")
+                       addr, port = trx[0], int(trx[1])
+                       return (addr, port)
+               except:
+                       raise argparse.ArgumentTypeError("Invalid TRX 
definition: %s" % val)
+
        def parse_argv(self):
                parser = argparse.ArgumentParser(prog = "fake_trx",
                        description = "Virtual Um-interface (fake transceiver)")
@@ -378,8 +399,19 @@
                        dest = "bb_base_port", type = int, default = 6700,
                        help = "Set BB base port number (default %(default)s)")

+               mtrx_group = parser.add_argument_group("Additional 
transceivers")
+               mtrx_group.add_argument("--bts-trx", metavar = 
"REMOTE_ADDR:BASE_PORT",
+                       dest = "bts_trx_list", type = self.trx_def, action = 
"append",
+                       help = "Add a transceiver for BTS (e.g. 
127.0.0.1:5703)")
+               mtrx_group.add_argument("--bb-trx", metavar = 
"REMOTE_ADDR:BASE_PORT",
+                       dest = "bb_trx_list", type = self.trx_def, action = 
"append",
+                       help = "Add a transceiver for BB (e.g. 127.0.0.1:6703)")
+
                argv = parser.parse_args()

+               # TODO: make sure there are no duplicates in both
+               # bts_trx_list and bb_trx_list
+
                # Make sure there is no overlap between ports
                if argv.bts_base_port == argv.bb_base_port:
                        parser.error("BTS and BB base ports shall be different")

--
To view, visit https://gerrit.osmocom.org/12325
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibff31fb3a958a714c828d0dea7e87d47f778fd80
Gerrit-Change-Number: 12325
Gerrit-PatchSet: 1
Gerrit-Owner: Vadim Yanitskiy <axilira...@gmail.com>

Reply via email to