<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10305">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trx_toolkit/fake_trx: introduce basic path loss simulation<br><br>This change introduces a couple of new CTRL commands for path loss<br>simulation, in particular a possibility to drop some amount of<br>bursts according to some TDMA frame period, separately for both<br>Uplink and Downlink directions.<br><br>Examples:<br><br>  FAKE_DROP 4 - drop 4 consistent (period=1) bursts,<br>  FAKE_DROP 16 2 - drop 16 even bursts (period=2).<br><br>Change-Id: Ib210138a03e2377c79875a4ff2f2bb58a43cfa46<br>Related: OS#3428<br>---<br>M src/target/trx_toolkit/burst_fwd.py<br>M src/target/trx_toolkit/ctrl_if_bb.py<br>M src/target/trx_toolkit/ctrl_if_bts.py<br>3 files changed, 123 insertions(+), 0 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/05/10305/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/trx_toolkit/burst_fwd.py b/src/target/trx_toolkit/burst_fwd.py</span><br><span>index bfbe0d6..3834849 100644</span><br><span>--- a/src/target/trx_toolkit/burst_fwd.py</span><br><span>+++ b/src/target/trx_toolkit/burst_fwd.py</span><br><span>@@ -66,6 +66,15 @@</span><br><span>         rssi_dl_threshold = 10</span><br><span>       rssi_ul_threshold = 5</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     # Path loss simulation: DL/UL burst dropping</span><br><span style="color: hsl(120, 100%, 40%);">+  # Indicates how many bursts should be dropped</span><br><span style="color: hsl(120, 100%, 40%);">+ # and which dropping period is used. By default,</span><br><span style="color: hsl(120, 100%, 40%);">+      # period is 1, i.e. every burst (fn % 1 is always 0)</span><br><span style="color: hsl(120, 100%, 40%);">+  burst_dl_drop_amount = 0</span><br><span style="color: hsl(120, 100%, 40%);">+      burst_ul_drop_amount = 0</span><br><span style="color: hsl(120, 100%, 40%);">+      burst_dl_drop_period = 1</span><br><span style="color: hsl(120, 100%, 40%);">+      burst_ul_drop_period = 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   def __init__(self, bts_link, bb_link):</span><br><span>               self.bts_link = bts_link</span><br><span>             self.bb_link = bb_link</span><br><span>@@ -131,6 +140,30 @@</span><br><span>                # Generate a random RSSI value</span><br><span>               return random.randint(rssi_min, rssi_max)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ # DL path loss simulation</span><br><span style="color: hsl(120, 100%, 40%);">+     def path_loss_sim_dl(self, msg):</span><br><span style="color: hsl(120, 100%, 40%);">+              # Burst dropping</span><br><span style="color: hsl(120, 100%, 40%);">+              if self.burst_dl_drop_amount > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                  if msg.fn % self.burst_dl_drop_period == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                           print("[~] Simulation: dropping DL burst (fn=%u %% %u == 0)"</span><br><span style="color: hsl(120, 100%, 40%);">+                                        % (msg.fn, self.burst_dl_drop_period))</span><br><span style="color: hsl(120, 100%, 40%);">+                                self.burst_dl_drop_amount -= 1</span><br><span style="color: hsl(120, 100%, 40%);">+                                return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         return msg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # UL path loss simulation</span><br><span style="color: hsl(120, 100%, 40%);">+     def path_loss_sim_ul(self, msg):</span><br><span style="color: hsl(120, 100%, 40%);">+              # Burst dropping</span><br><span style="color: hsl(120, 100%, 40%);">+              if self.burst_ul_drop_amount > 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                  if msg.fn % self.burst_ul_drop_period == 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                           print("[~] Simulation: dropping UL burst (fn=%u %% %u == 0)"</span><br><span style="color: hsl(120, 100%, 40%);">+                                        % (msg.fn, self.burst_ul_drop_period))</span><br><span style="color: hsl(120, 100%, 40%);">+                                self.burst_ul_drop_amount -= 1</span><br><span style="color: hsl(120, 100%, 40%);">+                                return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         return msg</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         # DL burst preprocessing</span><br><span>     def preprocess_dl_burst(self, msg):</span><br><span>          # Calculate both RSSI and ToA values</span><br><span>@@ -180,6 +213,11 @@</span><br><span>          if msg.tn != self.ts_pass:</span><br><span>                   return None</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               # Path loss simulation</span><br><span style="color: hsl(120, 100%, 40%);">+                msg = self.path_loss_sim_dl(msg)</span><br><span style="color: hsl(120, 100%, 40%);">+              if msg is None:</span><br><span style="color: hsl(120, 100%, 40%);">+                       return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                # Burst preprocessing</span><br><span>                self.preprocess_dl_burst(msg)</span><br><span> </span><br><span>@@ -211,6 +249,11 @@</span><br><span>             if msg is None:</span><br><span>                      return None</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               # Path loss simulation</span><br><span style="color: hsl(120, 100%, 40%);">+                msg = self.path_loss_sim_ul(msg)</span><br><span style="color: hsl(120, 100%, 40%);">+              if msg is None:</span><br><span style="color: hsl(120, 100%, 40%);">+                       return None</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                # Burst preprocessing</span><br><span>                self.preprocess_ul_burst(msg)</span><br><span> </span><br><span>diff --git a/src/target/trx_toolkit/ctrl_if_bb.py b/src/target/trx_toolkit/ctrl_if_bb.py</span><br><span>index 3de14ef..929caf4 100644</span><br><span>--- a/src/target/trx_toolkit/ctrl_if_bb.py</span><br><span>+++ b/src/target/trx_toolkit/ctrl_if_bb.py</span><br><span>@@ -150,6 +150,46 @@</span><br><span> </span><br><span>                    return 0</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+          # Path loss simulation for UL: burst dropping</span><br><span style="color: hsl(120, 100%, 40%);">+         # Syntax: CMD FAKE_DROP <AMOUNT></span><br><span style="color: hsl(120, 100%, 40%);">+                # Dropping pattern: fn % 1 == 0</span><br><span style="color: hsl(120, 100%, 40%);">+               elif self.verify_cmd(request, "FAKE_DROP", 1):</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   # Parse / validate amount of bursts</span><br><span style="color: hsl(120, 100%, 40%);">+                   num = int(request[1])</span><br><span style="color: hsl(120, 100%, 40%);">+                 if num < 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                                print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         return -1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   self.burst_fwd.burst_ul_drop_amount = num</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.burst_fwd.burst_ul_drop_period = 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     return 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            # Path loss simulation for UL: burst dropping</span><br><span style="color: hsl(120, 100%, 40%);">+         # Syntax: CMD FAKE_DROP <AMOUNT> <FN_PERIOD></span><br><span style="color: hsl(120, 100%, 40%);">+              # Dropping pattern: fn % period == 0</span><br><span style="color: hsl(120, 100%, 40%);">+          elif self.verify_cmd(request, "FAKE_DROP", 2):</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   # Parse / validate amount of bursts</span><br><span style="color: hsl(120, 100%, 40%);">+                   num = int(request[1])</span><br><span style="color: hsl(120, 100%, 40%);">+                 if num < 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                                print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         return -1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   # Parse / validate period</span><br><span style="color: hsl(120, 100%, 40%);">+                     period = int(request[2])</span><br><span style="color: hsl(120, 100%, 40%);">+                      if period <= 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                            print("[!] FAKE_DROP period shall be greater than zero")</span><br><span style="color: hsl(120, 100%, 40%);">+                            return -1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   self.burst_fwd.burst_ul_drop_amount = num</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.burst_fwd.burst_ul_drop_period = period</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                        return 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>           # Wrong / unknown command</span><br><span>            else:</span><br><span>                        # We don't care about other commands,</span><br><span>diff --git a/src/target/trx_toolkit/ctrl_if_bts.py b/src/target/trx_toolkit/ctrl_if_bts.py</span><br><span>index 1488617..72a0371 100644</span><br><span>--- a/src/target/trx_toolkit/ctrl_if_bts.py</span><br><span>+++ b/src/target/trx_toolkit/ctrl_if_bts.py</span><br><span>@@ -118,6 +118,46 @@</span><br><span> </span><br><span>                        return 0</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+          # Path loss simulation for DL: burst dropping</span><br><span style="color: hsl(120, 100%, 40%);">+         # Syntax: CMD FAKE_DROP <AMOUNT></span><br><span style="color: hsl(120, 100%, 40%);">+                # Dropping pattern: fn % 1 == 0</span><br><span style="color: hsl(120, 100%, 40%);">+               elif self.verify_cmd(request, "FAKE_DROP", 1):</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   # Parse / validate amount of bursts</span><br><span style="color: hsl(120, 100%, 40%);">+                   num = int(request[1])</span><br><span style="color: hsl(120, 100%, 40%);">+                 if num < 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                                print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         return -1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   self.burst_fwd.burst_dl_drop_amount = num</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.burst_fwd.burst_dl_drop_period = 1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                     return 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            # Path loss simulation for DL: burst dropping</span><br><span style="color: hsl(120, 100%, 40%);">+         # Syntax: CMD FAKE_DROP <AMOUNT> <FN_PERIOD></span><br><span style="color: hsl(120, 100%, 40%);">+              # Dropping pattern: fn % period == 0</span><br><span style="color: hsl(120, 100%, 40%);">+          elif self.verify_cmd(request, "FAKE_DROP", 2):</span><br><span style="color: hsl(120, 100%, 40%);">+                      print("[i] Recv FAKE_DROP cmd")</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   # Parse / validate amount of bursts</span><br><span style="color: hsl(120, 100%, 40%);">+                   num = int(request[1])</span><br><span style="color: hsl(120, 100%, 40%);">+                 if num < 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                                print("[!] FAKE_DROP amount shall not be negative")</span><br><span style="color: hsl(120, 100%, 40%);">+                         return -1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   # Parse / validate period</span><br><span style="color: hsl(120, 100%, 40%);">+                     period = int(request[2])</span><br><span style="color: hsl(120, 100%, 40%);">+                      if period <= 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                            print("[!] FAKE_DROP period shall be greater than zero")</span><br><span style="color: hsl(120, 100%, 40%);">+                            return -1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                   self.burst_fwd.burst_dl_drop_amount = num</span><br><span style="color: hsl(120, 100%, 40%);">+                     self.burst_fwd.burst_dl_drop_period = period</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                        return 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>           # Wrong / unknown command</span><br><span>            else:</span><br><span>                        # We don't care about other commands,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10305">change 10305</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/10305"/><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: Ib210138a03e2377c79875a4ff2f2bb58a43cfa46 </div>
<div style="display:none"> Gerrit-Change-Number: 10305 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>