<p>laforge <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/15444">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  fixeria: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">SMSCB: Send ETWS Primary Notifiation via RSL to BTS<br><br>In addition to transmission of the ETWS Primary Notification via all<br>dedicated channels, we also need to send it to the BTS for transmission<br>via PCH (P1 Rest Octets) and for forwarding to PCU for PACCH<br>transmission.<br><br>Change-Id: I7e45b0373458a4348b12b92dd92861062532548b<br>---<br>M include/osmocom/bsc/abis_rsl.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/smscb.c<br>4 files changed, 44 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/abis_rsl.h b/include/osmocom/bsc/abis_rsl.h</span><br><span>index ec63090..4ccfd14 100644</span><br><span>--- a/include/osmocom/bsc/abis_rsl.h</span><br><span>+++ b/include/osmocom/bsc/abis_rsl.h</span><br><span>@@ -91,6 +91,7 @@</span><br><span> int rsl_sms_cb_command(struct gsm_bts *bts, uint8_t chan_number,</span><br><span>                      struct rsl_ie_cb_cmd_type cb_command,</span><br><span>                        bool use_extended_cbch, const uint8_t *data, int len);</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_etws_pn_command(struct gsm_bts *bts, uint8_t chan_nr, const uint8_t *data, int len);</span><br><span> </span><br><span> /* some Nokia specific stuff */</span><br><span> int rsl_nokia_si_begin(struct gsm_bts_trx *trx);</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 8dfbc64..f6d6d5e 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1266,6 +1266,7 @@</span><br><span>  struct osmo_timer_list cbch_timer;</span><br><span>   struct bts_smscb_chan_state cbch_basic;</span><br><span>      struct bts_smscb_chan_state cbch_extended;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_timer_list etws_timer;      /* when to stop ETWS PN */</span><br><span> };</span><br><span> </span><br><span> /* One rejected BTS */</span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index 06d19a5..4a7d104 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -2203,6 +2203,25 @@</span><br><span>     return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Send an Osmocom-specific Abis RSL message for ETWS Primary Notification */</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_etws_pn_command(struct gsm_bts *bts, uint8_t chan_nr, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct abis_rsl_dchan_hdr *dh;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct msgb *msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span style="color: hsl(120, 100%, 40%);">+        init_dchan_hdr(dh, RSL_MT_OSMO_ETWS_CMD);</span><br><span style="color: hsl(120, 100%, 40%);">+     dh->c.msg_discr = ABIS_RSL_MDISC_COM_CHAN;</span><br><span style="color: hsl(120, 100%, 40%);">+ dh->chan_nr = chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msgb_tlv_put(msg, RSL_IE_SMSCB_MSG, len, data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     msg->dst = bts->c0->rsl_link;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return abis_rsl_sendmsg(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int rsl_sms_cb_command(struct gsm_bts *bts, uint8_t chan_number,</span><br><span>                      struct rsl_ie_cb_cmd_type cb_command,</span><br><span>                        bool use_extended_cbch, const uint8_t *data, int len)</span><br><span>diff --git a/src/osmo-bsc/smscb.c b/src/osmo-bsc/smscb.c</span><br><span>index 319ef21..8d48af9 100644</span><br><span>--- a/src/osmo-bsc/smscb.c</span><br><span>+++ b/src/osmo-bsc/smscb.c</span><br><span>@@ -40,6 +40,7 @@</span><br><span> #include <osmocom/bsc/vty.h></span><br><span> #include <osmocom/bsc/gsm_04_08_rr.h></span><br><span> #include <osmocom/bsc/lchan_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_rsl.h></span><br><span> </span><br><span> /*********************************************************************************</span><br><span>  * Helper Functions</span><br><span>@@ -461,8 +462,15 @@</span><br><span>  * Per-BTS Processing of CBSP from CBC, called via cbsp_per_bts()</span><br><span>  *********************************************************************************/</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void etws_primary_to_dedicated(struct gsm_bts *bts,</span><br><span style="color: hsl(0, 100%, 40%);">-                                     const struct osmo_cbsp_write_replace *wrepl)</span><br><span style="color: hsl(120, 100%, 40%);">+/* timer call-back once ETWS warning period has expired */</span><br><span style="color: hsl(120, 100%, 40%);">+static void etws_pn_cb(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = (struct gsm_bts *)data;</span><br><span style="color: hsl(120, 100%, 40%);">+ LOG_BTS(bts, DCBS, LOGL_NOTICE, "ETWS PN Timeout; disabling broadcast via PCH\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  rsl_etws_pn_command(bts, RSL_CHAN_PCH_AGCH, NULL, 0);</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%);">+static void etws_primary_to_bts(struct gsm_bts *bts, const struct osmo_cbsp_write_replace *wrepl)</span><br><span> {</span><br><span>   uint8_t etws_primary[ETWS_PRIM_NOTIF_SIZE];</span><br><span>  struct gsm_bts_trx *trx;</span><br><span>@@ -491,7 +499,18 @@</span><br><span>      LOG_BTS(bts, DCBS, LOGL_NOTICE, "Sent ETWS Primary Notification via %u dedicated channels\n",</span><br><span>              count);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* FIXME: Notify BTS of primary ETWS notification via vendor-specific Abis message */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Notify BTS of primary ETWS notification via vendor-specific Abis message */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (osmo_bts_has_feature(&bts->features, BTS_FEAT_ETWS_PN)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          rsl_etws_pn_command(bts, RSL_CHAN_PCH_AGCH, etws_primary, sizeof(etws_primary));</span><br><span style="color: hsl(120, 100%, 40%);">+              LOG_BTS(bts, DCBS, LOGL_NOTICE, "Sent ETWS Primary Notification via common channel\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             if (wrepl->u.emergency.warning_period != 0xffffffff) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_timer_setup(&bts->etws_timer, etws_pn_cb, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+                   osmo_timer_schedule(&bts->etws_timer, wrepl->u.emergency.warning_period, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                } else</span><br><span style="color: hsl(120, 100%, 40%);">+                        LOG_BTS(bts, DCBS, LOGL_NOTICE, "Unlimited ETWS PN broadcast, this breaks "</span><br><span style="color: hsl(120, 100%, 40%);">+                         "normal network operation due to PCH blockage\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  } else</span><br><span style="color: hsl(120, 100%, 40%);">+                LOG_BTS(bts, DCBS, LOGL_ERROR, "BTS doesn't support RSL command for ETWS PN\n");</span><br><span> }</span><br><span> </span><br><span> /*! Try to execute a write-replace operation; roll-back if it fails.</span><br><span>@@ -563,9 +582,7 @@</span><br><span>        int rc;</span><br><span> </span><br><span>  if (!wrepl->is_cbs) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* send through any active dedicated channels of this BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-            etws_primary_to_dedicated(bts, wrepl);</span><br><span style="color: hsl(0, 100%, 40%);">-          /* TODO: send via RSL to BTS for transmission on PCH */</span><br><span style="color: hsl(120, 100%, 40%);">+               etws_primary_to_bts(bts, wrepl);</span><br><span>             return 0;</span><br><span>    }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/15444">change 15444</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-bsc/+/15444"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I7e45b0373458a4348b12b92dd92861062532548b </div>
<div style="display:none"> Gerrit-Change-Number: 15444 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </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-MessageType: merged </div>