<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9334">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add support for gsm0808 HANDOVER REQUIRED message<br><br>Related: OS#2283 (inter-BSC Handover, BSC side, MO)<br>Change-Id: Idb6dc3eab0282158a17091d97ed77c1e2e3eb3c2<br>---<br>M include/osmocom/gsm/gsm0808.h<br>M include/osmocom/gsm/protocol/gsm_08_08.h<br>M src/gsm/gsm0808.c<br>M src/gsm/libosmogsm.map<br>4 files changed, 130 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/34/9334/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h</span><br><span>index 369d713..c7fb660 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808.h</span><br><span>@@ -25,6 +25,7 @@</span><br><span> </span><br><span> #include "tlv.h"</span><br><span> #include <osmocom/gsm/protocol/gsm_08_08.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm0808_utils.h></span><br><span> #include <osmocom/gsm/gsm23003.h></span><br><span> </span><br><span> struct sockaddr_storage;</span><br><span>@@ -80,6 +81,42 @@</span><br><span>                              const uint8_t *chan_needed)</span><br><span>                                  OSMO_DEPRECATED("use gsm0808_create_paging2 instead");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! 3GPP TS 48.008 §3.2.2.5.8 Old BSS to New BSS information */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm0808_old_bss_to_new_bss_info {</span><br><span style="color: hsl(120, 100%, 40%);">+   bool extra_information_present;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              bool prec;</span><br><span style="color: hsl(120, 100%, 40%);">+            bool lcs;</span><br><span style="color: hsl(120, 100%, 40%);">+             bool ue_prob;</span><br><span style="color: hsl(120, 100%, 40%);">+ } extra_information;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        bool current_channel_type_2_present;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              uint8_t mode;</span><br><span style="color: hsl(120, 100%, 40%);">+         uint8_t field;</span><br><span style="color: hsl(120, 100%, 40%);">+        } current_channel_type_2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* more items are defined in the spec and may be added later */</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%);">+/*! 3GPP TS 48.008 §3.2.1.9 HANDOVER REQUIRED */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm0808_handover_required {</span><br><span style="color: hsl(120, 100%, 40%);">+  uint16_t cause;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm0808_cell_id_list2 cil;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   bool current_channel_type_1_present;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t current_channel_type_1;</span><br><span style="color: hsl(120, 100%, 40%);">+       </span><br><span style="color: hsl(120, 100%, 40%);">+      bool speech_version_used_present;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t speech_version_used;</span><br><span style="color: hsl(120, 100%, 40%);">+  </span><br><span style="color: hsl(120, 100%, 40%);">+      bool old_bss_to_new_bss_info_present;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm0808_old_bss_to_new_bss_info old_bss_to_new_bss_info;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* more items are defined in the spec and may be added later */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gsm0808_create_handover_required(const struct gsm0808_handover_required *params);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct msgb *gsm0808_create_dtap(struct msgb *msg, uint8_t link_id);</span><br><span> void gsm0808_prepend_dtap_header(struct msgb *msg, uint8_t link_id);</span><br><span> </span><br><span>diff --git a/include/osmocom/gsm/protocol/gsm_08_08.h b/include/osmocom/gsm/protocol/gsm_08_08.h</span><br><span>index b699080..60b9681 100644</span><br><span>--- a/include/osmocom/gsm/protocol/gsm_08_08.h</span><br><span>+++ b/include/osmocom/gsm/protocol/gsm_08_08.h</span><br><span>@@ -295,6 +295,28 @@</span><br><span>        GSM0808_IE_LAST_USED_EUTRAN_PLMN_ID     = 0x95,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* 3GPP TS 48.008 3.2.3 Signalling Field Element Coding */</span><br><span style="color: hsl(120, 100%, 40%);">+enum GSM0808_SIGNALLING_FIELD_ELEMENT_CODING {</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM0808_FE_IE_EXTRA_INFORMATION = 0x01, /*< 3.2.3.1  */</span><br><span style="color: hsl(120, 100%, 40%);">+    GSM0808_FE_IE_CURRENT_CHANNEL_TYPE_2 = 0x02, /*< 3.2.3.2  */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM0808_FE_IE_TARGET_CELL_RADIO_INFORMATION = 0x03, /*< 3.2.3.3  */</span><br><span style="color: hsl(120, 100%, 40%);">+        GSM0808_FE_IE_GPRS_SUSPEND_INFORMATION = 0x04, /*< 3.2.3.4  */</span><br><span style="color: hsl(120, 100%, 40%);">+     GSM0808_FE_IE_MULTIRATE_CONFIGURATION_INFORMATION = 0x05, /*< 3.2.3.5  */</span><br><span style="color: hsl(120, 100%, 40%);">+  GSM0808_FE_IE_DUAL_TRANSFER_MODE_INFORMATION = 0x06, /*< 3.2.3.6  */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM0808_FE_IE_INTER_RAT_HANDOVER_INFO = 0x07, /*< 3.2.3.7  */</span><br><span style="color: hsl(120, 100%, 40%);">+      GSM0808_FE_IE_CDMA2000_CAPABILITY_INFORMATION = 0x08, /*< 3.2.3.8  */</span><br><span style="color: hsl(120, 100%, 40%);">+      GSM0808_FE_IE_DOWNLINK_CELL_LOAD_INFORMATION = 0x09, /*< 3.2.3.9  */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM0808_FE_IE_UPLINK_CELL_LOAD_INFORMATION = 0x0a, /*< 3.2.3.10 */</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM0808_FE_IE_CELL_LOAD_INFORMATION_GROUP = 0x0b, /*< 3.2.3.11 */</span><br><span style="color: hsl(120, 100%, 40%);">+  GSM0808_FE_IE_CELL_LOAD_INFORMATION = 0x0c, /*< 3.2.3.12 */</span><br><span style="color: hsl(120, 100%, 40%);">+        GSM0808_FE_IE_PS_INDICATION = 0x0d, /*< 3.2.3.13 */</span><br><span style="color: hsl(120, 100%, 40%);">+        GSM0808_FE_IE_DTM_HANDOVER_COMMAND_INDICATION = 0x0e, /*< 3.2.3.14 */</span><br><span style="color: hsl(120, 100%, 40%);">+      GSM0808_FE_IE_D_RNTI = 0xfe, /*< 3.2.3.15 */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM0808_FE_IE_IRAT_MEASUREMENT_CONFIGURATION = 0x0f, /*< 3.2.3.16 */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM0808_FE_IE_SOURCE_CELL_ID = 0x10, /*< 3.2.3.17 */</span><br><span style="color: hsl(120, 100%, 40%);">+       GSM0808_FE_IE_IRAT_MEASUREMENT_CONFIGURATION_EXTENDED_E_ARFCNS = 0x11, /*< 3.2.3.18 */</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* GSM 08.08 3.2.2.5 Cause */</span><br><span> enum gsm0808_cause {</span><br><span>     GSM0808_CAUSE_RADIO_INTERFACE_MESSAGE_FAILURE                   = 0,</span><br><span>diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c</span><br><span>index 4743175..80f5e6c 100644</span><br><span>--- a/src/gsm/gsm0808.c</span><br><span>+++ b/src/gsm/gsm0808.c</span><br><span>@@ -609,6 +609,76 @@</span><br><span>         return gsm0808_create_paging2(imsi, tmsi, &cil2, chan_needed);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t put_old_bss_to_new_bss_information(struct msgb *msg,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                const struct gsm0808_old_bss_to_new_bss_info *i)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t *old_tail;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t *tlv_len;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msgb_put_u8(msg, GSM0808_IE_OLD_BSS_TO_NEW_BSS_INFORMATION);</span><br><span style="color: hsl(120, 100%, 40%);">+  tlv_len = msgb_put(msg, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   old_tail = msg->tail;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (i->extra_information_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+                uint8_t val = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (i->extra_information.prec)</span><br><span style="color: hsl(120, 100%, 40%);">+                     val |= 1 << 0;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (i->extra_information.lcs)</span><br><span style="color: hsl(120, 100%, 40%);">+                      val |= 1 << 1;</span><br><span style="color: hsl(120, 100%, 40%);">+          if (i->extra_information.ue_prob)</span><br><span style="color: hsl(120, 100%, 40%);">+                  val |= 1 << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+          msgb_tlv_put(msg, GSM0808_FE_IE_EXTRA_INFORMATION, 1, &val);</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%);">+   if (i->current_channel_type_2_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+           uint8_t val[2] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                    i->current_channel_type_2.mode,</span><br><span style="color: hsl(120, 100%, 40%);">+                    i->current_channel_type_2.field,</span><br><span style="color: hsl(120, 100%, 40%);">+           };</span><br><span style="color: hsl(120, 100%, 40%);">+            msgb_tlv_put(msg, GSM0808_FE_IE_CURRENT_CHANNEL_TYPE_2, 2, val);</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%);">+   *tlv_len = (uint8_t) (msg->tail - old_tail);</span><br><span style="color: hsl(120, 100%, 40%);">+       return *tlv_len + 2;</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%);">+/*! Create BSSMAP HANDOVER REQUIRED message.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] params  All information to be encoded.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \returns newly allocated msgb with BSSMAP REQUIRED message. */</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gsm0808_create_handover_required(const struct gsm0808_handover_required *params)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "BSSMAP-HANDOVER-REQUIRED");</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Message Type, 3.2.2.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+   msgb_v_put(msg, BSS_MAP_MSG_HANDOVER_REQUIRED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Cause, 3.2.2.5 */</span><br><span style="color: hsl(120, 100%, 40%);">+  msgb_tlv_put(msg, GSM0808_IE_CAUSE, params->cause & 0x80? 2 : 1, (const uint8_t*)&params->cause);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Cell Identifier List, 3.2.2.27 */</span><br><span style="color: hsl(120, 100%, 40%);">+  gsm0808_enc_cell_id_list2(msg, &params->cil);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Current Channel Type 1, 3.2.2.49 */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (params->current_channel_type_1_present)</span><br><span style="color: hsl(120, 100%, 40%);">+                msgb_tv_fixed_put(msg, GSM0808_IE_CURRENT_CHANNEL_TYPE_1, 1, &params->current_channel_type_1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Speech Version (Used), 3.2.2.51 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (params->speech_version_used_present)</span><br><span style="color: hsl(120, 100%, 40%);">+           msgb_tv_fixed_put(msg, GSM0808_IE_SPEECH_VERSION, 1, &params->speech_version_used);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (params->old_bss_to_new_bss_info_present)</span><br><span style="color: hsl(120, 100%, 40%);">+               put_old_bss_to_new_bss_information(msg, &params->old_bss_to_new_bss_info);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* pre-pend the header */</span><br><span style="color: hsl(120, 100%, 40%);">+     msg->l3h = msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return msg;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Prepend a DTAP header to given Message Buffer</span><br><span>  *  \param[in] msgb Message Buffer</span><br><span>  *  \param[in] link_id Link Identifier */</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index 5a57429..58a5bfe 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -161,6 +161,7 @@</span><br><span> gsm0808_create_reset;</span><br><span> gsm0808_create_reset_ack;</span><br><span> gsm0808_create_sapi_reject;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_create_handover_required;</span><br><span> gsm0808_prepend_dtap_header;</span><br><span> gsm0808_enc_aoip_trasp_addr;</span><br><span> gsm0808_dec_aoip_trasp_addr;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9334">change 9334</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/9334"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Idb6dc3eab0282158a17091d97ed77c1e2e3eb3c2 </div>
<div style="display:none"> Gerrit-Change-Number: 9334 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>