<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-trx/+/15289">View Change</a></p><div style="white-space:pre-wrap">Approvals:
Jenkins Builder: Verified
laforge: Looks good to me, approved
</div><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, 54 insertions(+), 31 deletions(-)<br><br></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 9a1c446..23aabdd 100644</span><br><span>--- a/Transceiver52M/Transceiver.cpp</span><br><span>+++ b/Transceiver52M/Transceiver.cpp</span><br><span>@@ -750,7 +750,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>@@ -761,7 +761,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>@@ -770,7 +770,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>@@ -889,7 +889,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>@@ -922,8 +922,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>@@ -990,18 +993,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>@@ -1026,22 +1032,21 @@</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(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> if (!bi.idle)</span><br><span style="color: hsl(0, 100%, 40%);">- logRxBurst(chan, &bi);</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>@@ -1102,7 +1107,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>@@ -1112,11 +1117,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>@@ -1131,7 +1138,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>@@ -1142,7 +1153,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>@@ -1171,7 +1186,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>@@ -1189,7 +1208,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: 3 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>