<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/18319">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trxcon: refactor trx_if_cmd_setfh(): send Rx/Tx frequencies<br><br>It would make sense to send the ARFCN list in parameters of SETFH<br>command, if there was a clear distinction between transceivers in<br>fake_trx.py, i.e. which one is an MS and which is a BTS.<br><br>Right now, every Transceiver is an abstract entity that emits<br>and receives bursts. So when you convert an ARFCN to a pair of<br>Downlink/Uplink frequencies, you don't know whether it maps<br>as Rx/Tx or as Tx/Rx for a given Transceiver.<br><br>Of course, we could assume that this is an MS specific feature,<br>and a pair of Downlink/Uplink frequencies always corresponds to<br>Rx/Tx, but what if some day we would need to implement and test<br>a similar approach for the BTS side? Also, by sending frequency<br>values in kHz (rather than ARFCNs) we can avoid inconsistency<br>with the existing RXTUNE / TXTUNE commands.<br><br>Change-Id: Ia2bf08797f1a37b56cf47945694b901f92765b58<br>Related: I587e4f5da67c7b7f28e010ed46b24622c31a3fdd<br>Related: OS#4546<br>---<br>M src/host/trxcon/trx_if.c<br>1 file changed, 38 insertions(+), 20 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/19/18319/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/trxcon/trx_if.c b/src/host/trxcon/trx_if.c</span><br><span>index cb54c9e..ce8d50e 100644</span><br><span>--- a/src/host/trxcon/trx_if.c</span><br><span>+++ b/src/host/trxcon/trx_if.c</span><br><span>@@ -397,41 +397,59 @@</span><br><span> }</span><br><span> </span><br><span> /*</span><br><span style="color: hsl(0, 100%, 40%);">- * Frequency Hopping parameters indication</span><br><span style="color: hsl(120, 100%, 40%);">+ * Frequency Hopping parameters indication.</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * SETFH instructs transceiver to enable frequency</span><br><span style="color: hsl(0, 100%, 40%);">- * hopping mode using the given parameters.</span><br><span style="color: hsl(0, 100%, 40%);">- * CMD SETFH <HSN> <MAIO> <CH1> <CH2> [... <CHN>]</span><br><span style="color: hsl(120, 100%, 40%);">+ * SETFH instructs transceiver to enable frequency hopping mode</span><br><span style="color: hsl(120, 100%, 40%);">+ * using the given HSN, MAIO, and Mobile Allocation parameters.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * CMD SETFH <HSN> <MAIO> <RXF1> <TXF1></span><br><span style="color: hsl(120, 100%, 40%);">+ *                         <RXF2> <TXF2></span><br><span style="color: hsl(120, 100%, 40%);">+ *              [... <RXFN> <TXFN>]</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * where <RXFN> and <TXFN> is a pair of Rx/Tx frequencies (in kHz)</span><br><span style="color: hsl(120, 100%, 40%);">+ * corresponding to one ARFCN the Mobile Allocation. Note that the</span><br><span style="color: hsl(120, 100%, 40%);">+ * channel list is expected to be sorted in ascending order.</span><br><span>  */</span><br><span> </span><br><span> int trx_if_cmd_setfh(struct trx_instance *trx, uint8_t hsn,</span><br><span>         uint8_t maio, uint16_t *ma, size_t ma_len)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- char ma_buf[100];</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Reserve some room for CMD SETFH <HSN> <MAIO> */</span><br><span style="color: hsl(120, 100%, 40%);">+        char ma_buf[TRXC_BUF_SIZE - 24];</span><br><span style="color: hsl(120, 100%, 40%);">+      size_t ma_buf_len = sizeof(ma_buf) - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t rx_freq, tx_freq;</span><br><span>   char *ptr;</span><br><span>   int i, rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* No channels, WTF?!? */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!ma_len)</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Make sure that Mobile Allocation has at least two entries */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ma_len < 2 || ma == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DTRX, LOGL_ERROR, "Mobile Allocation is too short\n");</span><br><span>                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /**</span><br><span style="color: hsl(0, 100%, 40%);">-      * Compose a sequence of channels (mobile allocation)</span><br><span style="color: hsl(0, 100%, 40%);">-    * FIXME: the length of a CTRL command is limited to 128 symbols,</span><br><span style="color: hsl(0, 100%, 40%);">-        * so we may have some problems if there are many channels...</span><br><span style="color: hsl(0, 100%, 40%);">-    */</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Compose a sequence of Rx/Tx frequencies (mobile allocation) */</span><br><span>    for (i = 0, ptr = ma_buf; i < ma_len; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         /* Append a channel */</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = snprintf(ptr, ma_buf + sizeof(ma_buf) - ptr, "%u ", ma[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Convert ARFCN to a pair of Rx/Tx frequencies (Hz * 10) */</span><br><span style="color: hsl(120, 100%, 40%);">+          rx_freq = gsm_arfcn2freq10(ma[i], 0); /* Rx: Downlink */</span><br><span style="color: hsl(120, 100%, 40%);">+              tx_freq = gsm_arfcn2freq10(ma[i], 1); /* Tx: Uplink */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (rx_freq == 0xffff || tx_freq == 0xffff) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 LOGP(DTRX, LOGL_ERROR, "Failed to convert ARFCN %u "</span><br><span style="color: hsl(120, 100%, 40%);">+                             "to a pair of Rx/Tx frequencies\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         ma[i] & ~ARFCN_FLAG_MASK);</span><br><span style="color: hsl(120, 100%, 40%);">+                   return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Append a pair of Rx/Tx frequencies (in kHz) to the buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = snprintf(ptr, ma_buf_len, "%u %u ", rx_freq * 100, tx_freq * 100);</span><br><span style="color: hsl(120, 100%, 40%);">+             if (rc < 0 || rc > ma_buf_len) { /* Prevent buffer overflow */</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGP(DTRX, LOGL_ERROR, "Not enough room to encode "</span><br><span style="color: hsl(120, 100%, 40%);">+                      "Mobile Allocation (N=%zu)\n", ma_len);</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -ENOSPC;</span><br><span style="color: hsl(120, 100%, 40%);">+               }</span><br><span> </span><br><span>                /* Move pointer */</span><br><span style="color: hsl(120, 100%, 40%);">+            ma_buf_len -= rc;</span><br><span>            ptr += rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-              /* Prevent buffer overflow */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ptr >= (ma_buf + 100))</span><br><span style="color: hsl(0, 100%, 40%);">-                   return -EIO;</span><br><span>         }</span><br><span> </span><br><span>        /* Overwrite the last space */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/18319">change 18319</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/c/osmocom-bb/+/18319"/><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-Change-Id: Ia2bf08797f1a37b56cf47945694b901f92765b58 </div>
<div style="display:none"> Gerrit-Change-Number: 18319 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>