<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10170">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Vadim Yanitskiy: Looks good to me, but someone else must approve
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">clear GPRS indicator in SI3 while PCU is disconnected<br><br>osmo-bts cannot provide GPRS service while osmo-pcu is not connected.<br>The BSC has no knowledge of the PCU connection state. Prevent MSs<br>from trying to register for GPRS while the PCU is disconnected by<br>erasing the GPRS Indicator in SI3.<br><br>Change-Id: I1a6f5c636c0fe098ee31c280d4572a3f8122b44b<br>Depends: I690cf308311f910005a325d50f5d5d825678d2b2 (libosmocore.git)<br>Depends: I08e0ca9a8d13c7aa40b9d90f34f0e13adb87d4e0 (libosmocore.git)<br>Depends: I8b1ee2405f6338507e9dfb5f1f437c4c2db2e330 (libosmocore.git)<br>Related: OS#3075<br>---<br>M include/osmo-bts/bts.h<br>M include/osmo-bts/gsm_data_shared.h<br>M src/common/pcu_sock.c<br>M src/common/rsl.c<br>M src/common/sysinfo.c<br>5 files changed, 63 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index d7c4bbf..970fb1b 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -48,6 +48,7 @@</span><br><span>                int is_ag_res);</span><br><span> </span><br><span> uint8_t *bts_sysinfo_get(struct gsm_bts *bts, const struct gsm_time *g_time);</span><br><span style="color: hsl(120, 100%, 40%);">+void regenerate_si3_restoctets(struct gsm_bts *bts);</span><br><span> uint8_t *lchan_sacch_get(struct gsm_lchan *lchan);</span><br><span> int lchan_init_lapdm(struct gsm_lchan *lchan);</span><br><span> </span><br><span>diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h</span><br><span>index 415e6bc..90772e2 100644</span><br><span>--- a/include/osmo-bts/gsm_data_shared.h</span><br><span>+++ b/include/osmo-bts/gsm_data_shared.h</span><br><span>@@ -15,6 +15,7 @@</span><br><span> #include <osmocom/gsm/rxlev_stat.h></span><br><span> #include <osmocom/gsm/sysinfo.h></span><br><span> #include <osmocom/gsm/meas_rep.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm48_rest_octets.h></span><br><span> #include <osmocom/gsm/protocol/gsm_04_08.h></span><br><span> #include <osmocom/gsm/protocol/gsm_08_58.h></span><br><span> #include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span>@@ -620,6 +621,10 @@</span><br><span>      /* offsets used while generating SI2quater */</span><br><span>        size_t e_offset;</span><br><span>     size_t u_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+      /* decoded SI3 rest octets - *unmodified* as received from BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct osmo_gsm48_si_ro_info si3_ro_decoded;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* is SI3 GPRS Indicator currently disabled due to lack of PCU connection? */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool si3_gprs_ind_disabled;</span><br><span> </span><br><span>      /* ip.accesss Unit ID's have Site/BTS/TRX layout */</span><br><span>      union {</span><br><span>diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c</span><br><span>index e4f2d66..39b4568 100644</span><br><span>--- a/src/common/pcu_sock.c</span><br><span>+++ b/src/common/pcu_sock.c</span><br><span>@@ -1,6 +1,6 @@</span><br><span> /* pcu_sock.c: Connect from PCU via unix domain socket */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2008-2019 by Harald Welte <laforge@gnumonks.org></span><br><span>  * (C) 2009-2012 by Andreas Eversberg <jolly@eversberg.eu></span><br><span>  * (C) 2012 by Holger Hans Peter Freyther</span><br><span>  * All Rights Reserved</span><br><span>@@ -598,6 +598,9 @@</span><br><span>             oml_tx_failure_event_rep(&bts->gprs.cell.mo, NM_SEVER_CEASED, OSMO_EVT_PCU_VERS, txt->text);</span><br><span>               osmo_strlcpy(bts->pcu_version, txt->text, MAX_VERSION_LENGTH);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+              /* patch SI3 to advertise GPRS, *if* the SI3 sent by BSC said so */</span><br><span style="color: hsl(120, 100%, 40%);">+           regenerate_si3_restoctets(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>            if (GSM_BTS_HAS_SI(bts, SYSINFO_TYPE_13))</span><br><span>                    return pcu_tx_si13(bts, true);</span><br><span> </span><br><span>@@ -741,6 +744,9 @@</span><br><span>     bfd->fd = -1;</span><br><span>     osmo_fd_unregister(bfd);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* patch SI3 to remove GPRS indicator */</span><br><span style="color: hsl(120, 100%, 40%);">+      regenerate_si3_restoctets(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    /* re-enable the generation of ACCEPT for new connections */</span><br><span>         state->listen_bfd.when |= BSC_FD_READ;</span><br><span> </span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index f76a006..b96182f 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -1,7 +1,7 @@</span><br><span> /* GSM TS 08.58 RSL, BTS Side */</span><br><span> </span><br><span> /* (C) 2011 by Andreas Eversberg <jolly@eversberg.eu></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2011-2017 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2011-2019 by Harald Welte <laforge@gnumonks.org></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -360,12 +360,18 @@</span><br><span> </span><br><span>            bts->si_valid |= (1 << osmo_si);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           if (SYSINFO_TYPE_3 == osmo_si && trx->nr == 0 &&</span><br><span style="color: hsl(0, 100%, 40%);">-                 num_agch(trx, "RSL") != 1) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      lchan_deactivate(&trx->bts->c0->ts[0].lchan[CCCH_LCHAN]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  /* will be reactivated by sapi_deactivate_cb() */</span><br><span style="color: hsl(0, 100%, 40%);">-                       trx->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind =</span><br><span style="color: hsl(0, 100%, 40%);">-                           LCHAN_REL_ACT_REACT;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (SYSINFO_TYPE_3 == osmo_si) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (trx->nr == 0 && num_agch(trx, "RSL") != 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         lchan_deactivate(&trx->bts->c0->ts[0].lchan[CCCH_LCHAN]);</span><br><span style="color: hsl(120, 100%, 40%);">+                                /* will be reactivated by sapi_deactivate_cb() */</span><br><span style="color: hsl(120, 100%, 40%);">+                             trx->bts->c0->ts[0].lchan[CCCH_LCHAN].rel_act_kind =</span><br><span style="color: hsl(120, 100%, 40%);">+                                 LCHAN_REL_ACT_REACT;</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* decode original SI3 Rest Octets as sent by BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_gsm48_rest_octets_si3_decode(&bts->si3_ro_decoded, GSM_BTS_SI(bts, osmo_si));</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* patch out GPRS indicator from binary if PCU is not connected; will be enabled</span><br><span style="color: hsl(120, 100%, 40%);">+                       * after PCU connects */</span><br><span style="color: hsl(120, 100%, 40%);">+                      regenerate_si3_restoctets(bts);</span><br><span>              }</span><br><span> </span><br><span>                if (SYSINFO_TYPE_13 == osmo_si)</span><br><span>@@ -387,6 +393,8 @@</span><br><span>                        get_value_string(osmo_sitype_strs, osmo_si));</span><br><span>                if (SYSINFO_TYPE_13 == osmo_si)</span><br><span>                      pcu_tx_si13(trx->bts, false);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (SYSINFO_TYPE_3 == osmo_si)</span><br><span style="color: hsl(120, 100%, 40%);">+                        memset(&bts->si3_ro_decoded, 0, sizeof(bts->si3_ro_decoded));</span><br><span>      }</span><br><span>    osmo_signal_dispatch(SS_GLOBAL, S_NEW_SYSINFO, bts);</span><br><span> </span><br><span>diff --git a/src/common/sysinfo.c b/src/common/sysinfo.c</span><br><span>index e4a05c8..c41f9d6 100644</span><br><span>--- a/src/common/sysinfo.c</span><br><span>+++ b/src/common/sysinfo.c</span><br><span>@@ -1,4 +1,4 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2011 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2011-2019 by Harald Welte <laforge@gnumonks.org></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -24,6 +24,7 @@</span><br><span> </span><br><span> #include <osmo-bts/logging.h></span><br><span> #include <osmo-bts/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/pcu_if.h></span><br><span> </span><br><span> /* properly increment SI2q index and return SI2q data for scheduling */</span><br><span> static inline uint8_t *get_si2q_inc_index(struct gsm_bts *bts)</span><br><span>@@ -175,3 +176,36 @@</span><br><span>      LOGPLCHAN(lchan, DL1P, LOGL_NOTICE, "SACCH no SI available\n");</span><br><span>    return NULL;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* re-generate SI3 restoctets with GPRS indicator depending on the PCU socket connection state */</span><br><span style="color: hsl(120, 100%, 40%);">+void regenerate_si3_restoctets(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t *si3_buf = GSM_BTS_SI(bts, SYSINFO_TYPE_3);</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t si3_size = offsetof(struct gsm48_system_information_type_3, rest_octets);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_gsm48_si_ro_info si3ro_tmp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* If BSC has never set SI3, there's nothing to patch */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!GSM_BTS_HAS_SI(bts, SYSINFO_TYPE_3))</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* If SI3 from BSC doesn't have a GPRS indicator, we won't have anything to patch */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!bts->si3_ro_decoded.gprs_ind.present)</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Create a temporary copy and patch that, if no PCU is around */</span><br><span style="color: hsl(120, 100%, 40%);">+     si3ro_tmp = bts->si3_ro_decoded;</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!pcu_connected()) {</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!bts->si3_gprs_ind_disabled)</span><br><span style="color: hsl(120, 100%, 40%);">+                   LOGP(DPCU, LOGL_NOTICE, "Disabling GPRS Indicator in SI3 (No PCU connected)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            bts->si3_gprs_ind_disabled = true;</span><br><span style="color: hsl(120, 100%, 40%);">+         si3ro_tmp.gprs_ind.present = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (bts->si3_gprs_ind_disabled)</span><br><span style="color: hsl(120, 100%, 40%);">+                    LOGP(DPCU, LOGL_NOTICE, "Enabling GPRS Indicator in SI3 (PCU connected)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                bts->si3_gprs_ind_disabled = false;</span><br><span style="color: hsl(120, 100%, 40%);">+                si3ro_tmp.gprs_ind.present = 1; /* is a no-op as we copy from bts->si3_ro_decoded */</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%);">+   /* re-generate the binary SI3 rest octets */</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_gsm48_rest_octets_si3_encode(si3_buf + si3_size, &si3ro_tmp);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10170">change 10170</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/10170"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I1a6f5c636c0fe098ee31c280d4572a3f8122b44b </div>
<div style="display:none"> Gerrit-Change-Number: 10170 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <stsp@stsp.name> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <stsp@stsp.name> </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-CC: Max <suraev@alumni.ntnu.no> </div>