<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/15289">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Transceiver: exit process when BTS drops connection<br><br>We don't want to keep osmo-trx running in a started state once the BTS<br>controlling it becomes unavailable. If a socket towards the BTS fails,<br>it means the BTS is gone and the best thing to do is to stop the process<br>(alternatively we could go back to stopped state instead, and wait for<br>BTS to re-connect, fur so far this action is good enough).<br><br>Related: OS#4170<br>Change-Id: I2ccbe3c17b39fb792ea7810f840235c348054d66<br>---<br>M Transceiver52M/Transceiver.cpp<br>M Transceiver52M/Transceiver.h<br>2 files changed, 58 insertions(+), 33 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-trx refs/changes/89/15289/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp</span><br><span>index 8ba4674..239f309 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -708,7 +708,7 @@</span><br><span> ret_idle:</span><br><span>   bi->idle = true;</span><br><span>   delete radio_burst;</span><br><span style="color: hsl(0, 100%, 40%);">-  return false;</span><br><span style="color: hsl(120, 100%, 40%);">+  return true;</span><br><span> }</span><br><span> </span><br><span> void Transceiver::reset()</span><br><span>@@ -749,7 +749,7 @@</span><br><span>   return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void Transceiver::driveControl(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+bool Transceiver::driveControl(size_t chan)</span><br><span> {</span><br><span>   char buffer[MAX_PACKET_LENGTH + 1];</span><br><span>   char response[MAX_PACKET_LENGTH + 1];</span><br><span>@@ -760,7 +760,7 @@</span><br><span>   msgLen = read(mCtrlSockets[chan], buffer, MAX_PACKET_LENGTH);</span><br><span>   if (msgLen <= 0) {</span><br><span>     LOGCHAN(chan, DTRXCTRL, WARNING) << "mCtrlSockets read(" << mCtrlSockets[chan] << ") failed: " << msgLen;</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return false;</span><br><span>   }</span><br><span> </span><br><span>   /* Zero-terminate received string */</span><br><span>@@ -769,7 +769,7 @@</span><br><span>   /* Verify a command signature */</span><br><span>   if (strncmp(buffer, "CMD ", 4)) {</span><br><span>     LOGC(DTRXCTRL, WARNING) << "bogus message on control interface";</span><br><span style="color: hsl(0, 100%, 40%);">-    return;</span><br><span style="color: hsl(120, 100%, 40%);">+    return false;</span><br><span>   }</span><br><span> </span><br><span>   /* Set command pointer */</span><br><span>@@ -888,7 +888,7 @@</span><br><span>     if ((timeslot < 0) || (timeslot > 7)) {</span><br><span>       LOGC(DTRXCTRL, WARNING) << "bogus message on control interface";</span><br><span>       sprintf(response,"RSP SETSLOT 1 %d %d",timeslot,corrCode);</span><br><span style="color: hsl(0, 100%, 40%);">-      return;</span><br><span style="color: hsl(120, 100%, 40%);">+      return true;</span><br><span>     }</span><br><span>     mStates[chan].chanType[timeslot] = (ChannelCombination) corrCode;</span><br><span>     setModulus(timeslot, chan);</span><br><span>@@ -921,8 +921,11 @@</span><br><span> </span><br><span>   LOGCHAN(chan, DTRXCTRL, INFO) << "response is '" << response << "'";</span><br><span>   msgLen = write(mCtrlSockets[chan], response, strlen(response) + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (msgLen <= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+  if (msgLen <= 0) {</span><br><span>     LOGCHAN(chan, DTRXCTRL, WARNING) << "mCtrlSockets write(" << mCtrlSockets[chan] << ") failed: " << msgLen;</span><br><span style="color: hsl(120, 100%, 40%);">+    return false;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  return true;</span><br><span> }</span><br><span> </span><br><span> bool Transceiver::driveTxPriorityQueue(size_t chan)</span><br><span>@@ -989,18 +992,21 @@</span><br><span>   return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void Transceiver::driveReceiveRadio()</span><br><span style="color: hsl(120, 100%, 40%);">+bool Transceiver::driveReceiveRadio()</span><br><span> {</span><br><span>   int rc = mRadioInterface->driveReceiveRadio();</span><br><span>   if (rc == 0) {</span><br><span>     usleep(100000);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-    LOG(FATAL) << "radio Interface receive failed, requesting stop.";</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else if (mForceClockInterface || mTransmitDeadlineClock > mLastClockUpdateTime + GSM::Time(216,0)) {</span><br><span style="color: hsl(0, 100%, 40%);">-    mForceClockInterface = false;</span><br><span style="color: hsl(0, 100%, 40%);">-    writeClockInterface();</span><br><span style="color: hsl(120, 100%, 40%);">+    return true;</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+    return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (mForceClockInterface || mTransmitDeadlineClock > mLastClockUpdateTime + GSM::Time(216,0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+    mForceClockInterface = false;</span><br><span style="color: hsl(120, 100%, 40%);">+    return writeClockInterface();</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+  return true;</span><br><span> }</span><br><span> </span><br><span> void Transceiver::logRxBurst(size_t chan, const struct trx_ul_burst_ind *bi)</span><br><span>@@ -1025,22 +1031,23 @@</span><br><span>     << " bits: "   << os;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void Transceiver::driveReceiveFIFO(size_t chan)</span><br><span style="color: hsl(120, 100%, 40%);">+bool Transceiver::driveReceiveFIFO(size_t chan)</span><br><span> {</span><br><span>   struct trx_ul_burst_ind bi;</span><br><span> </span><br><span>   if (!pullRadioVector(chan, &bi))</span><br><span style="color: hsl(0, 100%, 40%);">-        return;</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!bi.idle)</span><br><span style="color: hsl(0, 100%, 40%);">-       logRxBurst(chan, &bi);</span><br><span style="color: hsl(120, 100%, 40%);">+    return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (bi.idle)</span><br><span style="color: hsl(120, 100%, 40%);">+    return true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  logRxBurst(chan, &bi);</span><br><span> </span><br><span>   switch (mVersionTRXD[chan]) {</span><br><span>     case 0:</span><br><span style="color: hsl(0, 100%, 40%);">-      trxd_send_burst_ind_v0(chan, mDataSockets[chan], &bi);</span><br><span style="color: hsl(0, 100%, 40%);">-      break;</span><br><span style="color: hsl(120, 100%, 40%);">+      return trxd_send_burst_ind_v0(chan, mDataSockets[chan], &bi);</span><br><span>     case 1:</span><br><span style="color: hsl(0, 100%, 40%);">-      trxd_send_burst_ind_v1(chan, mDataSockets[chan], &bi);</span><br><span style="color: hsl(0, 100%, 40%);">-      break;</span><br><span style="color: hsl(120, 100%, 40%);">+      return trxd_send_burst_ind_v1(chan, mDataSockets[chan], &bi);</span><br><span>     default:</span><br><span>       OSMO_ASSERT(false);</span><br><span>   }</span><br><span>@@ -1101,7 +1108,7 @@</span><br><span> </span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void Transceiver::writeClockInterface()</span><br><span style="color: hsl(120, 100%, 40%);">+bool Transceiver::writeClockInterface()</span><br><span> {</span><br><span>   int msgLen;</span><br><span>   char command[50];</span><br><span>@@ -1111,11 +1118,13 @@</span><br><span>   LOG(INFO) << "ClockInterface: sending " << command;</span><br><span> </span><br><span>   msgLen = write(mClockSocket, command, strlen(command) + 1);</span><br><span style="color: hsl(0, 100%, 40%);">-  if (msgLen <= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-    LOG(WARNING) << "mClockSocket write(" << mClockSocket << ") failed: " << msgLen;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (msgLen <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+    LOG(ERROR) << "mClockSocket write(" << mClockSocket << ") failed: " << msgLen;</span><br><span style="color: hsl(120, 100%, 40%);">+    return false;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span> </span><br><span>   mLastClockUpdateTime = mTransmitDeadlineClock;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+  return true;</span><br><span> }</span><br><span> </span><br><span> void *RxUpperLoopAdapter(TrxChanThParams *params)</span><br><span>@@ -1130,7 +1139,11 @@</span><br><span>   set_selfthread_name(thread_name);</span><br><span> </span><br><span>   while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-    trx->driveReceiveFIFO(num);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!trx->driveReceiveFIFO(num)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGCHAN(num, DMAIN, FATAL) << "Something went wrong in thread " << thread_name << ", requesting stop";</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      break;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>     pthread_testcancel();</span><br><span>   }</span><br><span>   return NULL;</span><br><span>@@ -1141,7 +1154,11 @@</span><br><span>   set_selfthread_name("RxLower");</span><br><span> </span><br><span>   while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-    transceiver->driveReceiveRadio();</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!transceiver->driveReceiveRadio()) {</span><br><span style="color: hsl(120, 100%, 40%);">+      LOG(FATAL) << "Something went wrong in thread RxLower, requesting stop";</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      break;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>     pthread_testcancel();</span><br><span>   }</span><br><span>   return NULL;</span><br><span>@@ -1170,7 +1187,11 @@</span><br><span>   set_selfthread_name(thread_name);</span><br><span> </span><br><span>   while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-    trx->driveControl(num);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!trx->driveControl(num)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGCHAN(num, DTRXCTRL, FATAL) << "Something went wrong in thread " << thread_name << ", requesting stop";</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      break;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>     pthread_testcancel();</span><br><span>   }</span><br><span>   return NULL;</span><br><span>@@ -1188,7 +1209,11 @@</span><br><span>   set_selfthread_name(thread_name);</span><br><span> </span><br><span>   while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">-    trx->driveTxPriorityQueue(num);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!trx->driveTxPriorityQueue(num)) {</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGCHAN(num, DMAIN, FATAL) << "Something went wrong in thread " << thread_name << ", requesting stop";</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_signal_dispatch(SS_MAIN, S_MAIN_STOP_REQUIRED, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+      break;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>     pthread_testcancel();</span><br><span>   }</span><br><span>   return NULL;</span><br><span>diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h</span><br><span>index 1a4d28f..0d09854 100644</span><br><span>--- a/Transceiver52M/Transceiver.h</span><br><span>+++ b/Transceiver52M/Transceiver.h</span><br><span>@@ -191,7 +191,7 @@</span><br><span>   CorrType expectedCorrType(GSM::Time currTime, size_t chan);</span><br><span> </span><br><span>   /** send messages over the clock socket */</span><br><span style="color: hsl(0, 100%, 40%);">-  void writeClockInterface(void);</span><br><span style="color: hsl(120, 100%, 40%);">+  bool writeClockInterface(void);</span><br><span> </span><br><span>   int mSPSTx;                          ///< number of samples per Tx symbol</span><br><span>   int mSPSRx;                          ///< number of samples per Rx symbol</span><br><span>@@ -221,16 +221,16 @@</span><br><span> </span><br><span> protected:</span><br><span>   /** drive lower receive I/O and burst generation */</span><br><span style="color: hsl(0, 100%, 40%);">-  void driveReceiveRadio();</span><br><span style="color: hsl(120, 100%, 40%);">+  bool driveReceiveRadio();</span><br><span> </span><br><span>   /** drive demodulation of GSM bursts */</span><br><span style="color: hsl(0, 100%, 40%);">-  void driveReceiveFIFO(size_t chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  bool driveReceiveFIFO(size_t chan);</span><br><span> </span><br><span>   /** drive transmission of GSM bursts */</span><br><span>   void driveTxFIFO();</span><br><span> </span><br><span>   /** drive handling of control messages from GSM core */</span><br><span style="color: hsl(0, 100%, 40%);">-  void driveControl(size_t chan);</span><br><span style="color: hsl(120, 100%, 40%);">+  bool driveControl(size_t chan);</span><br><span> </span><br><span>   /**</span><br><span>     drive modulation and sorting of GSM bursts from GSM core</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-trx/+/15289">change 15289</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/osmo-trx/+/15289"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-trx </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I2ccbe3c17b39fb792ea7810f840235c348054d66 </div>
<div style="display:none"> Gerrit-Change-Number: 15289 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>