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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">LCLS: add gsm0808_create_ass2()<br><br>It allows setting additional assignment parameters explicitly.<br><br>Change-Id: Id89765df3f8c12f55f73f1d7a9d90c8883eb3bba<br>Related: OS#2487<br>---<br>M include/osmocom/gsm/gsm0808.h<br>M src/gsm/gsm0808.c<br>M src/gsm/libosmogsm.map<br>M tests/gsm0808/gsm0808_test.c<br>M tests/gsm0808/gsm0808_test.ok<br>5 files changed, 133 insertions(+), 6 deletions(-)<br><br></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 e3fb6ad..79d89e5 100644</span><br><span>--- a/include/osmocom/gsm/gsm0808.h</span><br><span>+++ b/include/osmocom/gsm/gsm0808.h</span><br><span>@@ -64,6 +64,12 @@</span><br><span>                                 const struct sockaddr_storage *ss,</span><br><span>                           const struct gsm0808_speech_codec_list *scl,</span><br><span>                                 const uint32_t *ci);</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gsm0808_create_ass2(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const uint16_t *cic,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const struct sockaddr_storage *ss,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const uint32_t *ci,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const uint8_t *kc, const struct osmo_lcls *lcls);</span><br><span> struct msgb *gsm0808_create_ass_compl(uint8_t rr_cause, uint8_t chosen_channel,</span><br><span>                                      uint8_t encr_alg_id, uint8_t speech_mode,</span><br><span>                                    const struct sockaddr_storage *ss,</span><br><span>diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c</span><br><span>index e951ab1..69da57d 100644</span><br><span>--- a/src/gsm/gsm0808.c</span><br><span>+++ b/src/gsm/gsm0808.c</span><br><span>@@ -425,18 +425,22 @@</span><br><span>    return msg;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Create BSSMAP Assignment Request message, 3GPP TS 48.008 §3.2.1.1</span><br><span style="color: hsl(120, 100%, 40%);">+/*! Create BSSMAP Assignment Request message, 3GPP TS 48.008 §3.2.1.1.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  This is identical to gsm0808_create_ass(), but adds KC and LCLS IEs.</span><br><span>  *  \param[in] ct Channel Type</span><br><span>  *  \param[in] cic Circuit Identity Code (Classic A only)</span><br><span>  *  \param[in] ss Socket Address of MSC-side RTP socket (AoIP only)</span><br><span>  *  \param[in] scl Speech Codec List (AoIP only)</span><br><span>  *  \param[in] ci Call Identifier (Optional), §3.2.2.105</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] kc Kc128 ciphering key (Optional, A5/4), §3.2.2.109</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] lcls Optional LCLS parameters</span><br><span>  *  \returns callee-allocated msgb with BSSMAP Assignment Request message */</span><br><span style="color: hsl(0, 100%, 40%);">-struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(0, 100%, 40%);">-                           const uint16_t *cic,</span><br><span style="color: hsl(0, 100%, 40%);">-                            const struct sockaddr_storage *ss,</span><br><span style="color: hsl(0, 100%, 40%);">-                              const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(0, 100%, 40%);">-                            const uint32_t *ci)</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gsm0808_create_ass2(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const uint16_t *cic,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const struct sockaddr_storage *ss,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const uint32_t *ci,</span><br><span style="color: hsl(120, 100%, 40%);">+                           const uint8_t *kc, const struct osmo_lcls *lcls)</span><br><span> {</span><br><span>       /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */</span><br><span>    struct msgb *msg;</span><br><span>@@ -481,6 +485,27 @@</span><br><span>                               (uint8_t *) & ci_sw);</span><br><span>  }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (kc)</span><br><span style="color: hsl(120, 100%, 40%);">+               msgb_tv_fixed_put(msg, GSM0808_IE_KC_128, 16, kc);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (lcls) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* LCLS: §3.2.2.115 Global Call Reference */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (lcls->gcr)</span><br><span style="color: hsl(120, 100%, 40%);">+                     gsm0808_enc_gcr(msg, lcls->gcr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* LCLS: §3.2.2.116 Configuration */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (lcls->config != GSM0808_LCLS_CFG_NA)</span><br><span style="color: hsl(120, 100%, 40%);">+                   msgb_tv_put(msg, GSM0808_IE_LCLS_CONFIG, lcls->config);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* LCLS: §3.2.2.117 Connection Status Control */</span><br><span style="color: hsl(120, 100%, 40%);">+             if (lcls->control != GSM0808_LCLS_CSC_NA)</span><br><span style="color: hsl(120, 100%, 40%);">+                  msgb_tv_put(msg, GSM0808_IE_LCLS_CONN_STATUS_CTRL, lcls->control);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* LCLS: §3.2.2.118 Correlation-Not-Needed */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!lcls->corr_needed)</span><br><span style="color: hsl(120, 100%, 40%);">+                    msgb_v_put(msg, GSM0808_IE_LCLS_CORR_NOT_NEEDED);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* push the bssmap header */</span><br><span>         msg->l3h =</span><br><span>            msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));</span><br><span>@@ -488,6 +513,22 @@</span><br><span>    return msg;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Create BSSMAP Assignment Request message, 3GPP TS 48.008 §3.2.1.1.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ct Channel Type</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] cic Circuit Identity Code (Classic A only)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ss Socket Address of MSC-side RTP socket (AoIP only)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] scl Speech Codec List (AoIP only)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] ci Call Identifier (Optional), §3.2.2.105</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns callee-allocated msgb with BSSMAP Assignment Request message */</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct,</span><br><span style="color: hsl(120, 100%, 40%);">+                              const uint16_t *cic,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const struct sockaddr_storage *ss,</span><br><span style="color: hsl(120, 100%, 40%);">+                            const struct gsm0808_speech_codec_list *scl,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const uint32_t *ci)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        return gsm0808_create_ass2(ct, cic, ss, scl, ci, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Create BSSMAP Assignment Completed message</span><br><span>  *  \param[in] rr_cause GSM 04.08 RR Cause value</span><br><span>  *  \param[in] chosen_channel Chosen Channel</span><br><span>diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map</span><br><span>index 94ae76a..959d182 100644</span><br><span>--- a/src/gsm/libosmogsm.map</span><br><span>+++ b/src/gsm/libosmogsm.map</span><br><span>@@ -150,6 +150,7 @@</span><br><span> gsm0808_cause_name;</span><br><span> gsm0808_cause_class_name;</span><br><span> gsm0808_create_ass;</span><br><span style="color: hsl(120, 100%, 40%);">+gsm0808_create_ass2;</span><br><span> gsm0808_create_assignment_completed;</span><br><span> gsm0808_create_ass_compl;</span><br><span> gsm0808_create_assignment_failure;</span><br><span>diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c</span><br><span>index f0f3165..46169ea 100644</span><br><span>--- a/tests/gsm0808/gsm0808_test.c</span><br><span>+++ b/tests/gsm0808/gsm0808_test.c</span><br><span>@@ -415,6 +415,83 @@</span><br><span>  msgb_free(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void test_create_ass2()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   static const uint8_t res[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                BSSAP_MSG_BSS_MANAGEMENT,</span><br><span style="color: hsl(120, 100%, 40%);">+             0x45,</span><br><span style="color: hsl(120, 100%, 40%);">+         BSS_MAP_MSG_ASSIGMENT_RQST,</span><br><span style="color: hsl(120, 100%, 40%);">+           GSM0808_IE_CHANNEL_TYPE,</span><br><span style="color: hsl(120, 100%, 40%);">+              0x04, 0x01, 0x0b, 0x91, 0x15, 0x01, 0x00, 0x04,</span><br><span style="color: hsl(120, 100%, 40%);">+               GSM0808_IE_AOIP_TRASP_ADDR,</span><br><span style="color: hsl(120, 100%, 40%);">+           0x06,</span><br><span style="color: hsl(120, 100%, 40%);">+         0xac, 0x0c, 0x65, 0x0d, /* IPv4 */</span><br><span style="color: hsl(120, 100%, 40%);">+            0x02, 0x9a,</span><br><span style="color: hsl(120, 100%, 40%);">+           GSM0808_IE_SPEECH_CODEC_LIST,</span><br><span style="color: hsl(120, 100%, 40%);">+         0x07,</span><br><span style="color: hsl(120, 100%, 40%);">+         GSM0808_SCT_FR3 | 0x50,</span><br><span style="color: hsl(120, 100%, 40%);">+               0xef, 0xcd,</span><br><span style="color: hsl(120, 100%, 40%);">+           GSM0808_SCT_FR2 | 0xa0,</span><br><span style="color: hsl(120, 100%, 40%);">+               0x9f,</span><br><span style="color: hsl(120, 100%, 40%);">+         GSM0808_SCT_CSD | 0x90,</span><br><span style="color: hsl(120, 100%, 40%);">+               0xc0,</span><br><span style="color: hsl(120, 100%, 40%);">+         GSM0808_IE_CALL_ID,</span><br><span style="color: hsl(120, 100%, 40%);">+           0xde, 0xad, 0xfa, 0xce, /* CallID */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x83, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, /* Kc */</span><br><span style="color: hsl(120, 100%, 40%);">+                GSM0808_IE_GLOBAL_CALL_REF, 0x0d, /* GCR, length */</span><br><span style="color: hsl(120, 100%, 40%);">+           0x03, 0x44, 0x44, 0x44, /* GCR, Net ID */</span><br><span style="color: hsl(120, 100%, 40%);">+             0x02, 0xfe, 0xed, /* GCR, Node ID */</span><br><span style="color: hsl(120, 100%, 40%);">+          0x05, 0x41, 0x41, 0x41, 0x41, 0x41, /* GCR, Call ref. ID */</span><br><span style="color: hsl(120, 100%, 40%);">+           GSM0808_IE_LCLS_CONFIG, GSM0808_LCLS_CFG_BOTH_WAY,</span><br><span style="color: hsl(120, 100%, 40%);">+            GSM0808_IE_LCLS_CONN_STATUS_CTRL, GSM0808_LCLS_CSC_CONNECT,</span><br><span style="color: hsl(120, 100%, 40%);">+           GSM0808_IE_LCLS_CORR_NOT_NEEDED,</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%);">+     struct gsm0808_channel_type ct;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t cic = 4;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct sockaddr_storage ss;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct sockaddr_in sin;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm0808_speech_codec_list sc_list;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint32_t call_id = 0xDEADFACE;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_gcr_parsed gcr = { .net_len = 3, .node = 0xFEED };</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t Kc[16];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_lcls lcls = {</span><br><span style="color: hsl(120, 100%, 40%);">+             .config = GSM0808_LCLS_CFG_BOTH_WAY,</span><br><span style="color: hsl(120, 100%, 40%);">+          .control = GSM0808_LCLS_CSC_CONNECT,</span><br><span style="color: hsl(120, 100%, 40%);">+          .gcr = &gcr,</span><br><span style="color: hsl(120, 100%, 40%);">+              .corr_needed = false</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%);">+  memset(gcr.cr, 'A', 5);</span><br><span style="color: hsl(120, 100%, 40%);">+       memset(gcr.net, 'D', gcr.net_len);</span><br><span style="color: hsl(120, 100%, 40%);">+    memset(Kc, 'E', 16);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        memset(&ct, 0, sizeof(ct));</span><br><span style="color: hsl(120, 100%, 40%);">+       ct.ch_indctr = GSM0808_CHAN_SPEECH;</span><br><span style="color: hsl(120, 100%, 40%);">+   ct.ch_rate_type = GSM0808_SPEECH_HALF_PREF;</span><br><span style="color: hsl(120, 100%, 40%);">+   ct.perm_spch[0] = GSM0808_PERM_FR2;</span><br><span style="color: hsl(120, 100%, 40%);">+   ct.perm_spch[1] = GSM0808_PERM_HR2;</span><br><span style="color: hsl(120, 100%, 40%);">+   ct.perm_spch_len = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       memset(&sin, 0, sizeof(sin));</span><br><span style="color: hsl(120, 100%, 40%);">+     sin.sin_family = AF_INET;</span><br><span style="color: hsl(120, 100%, 40%);">+     sin.sin_port = htons(666);</span><br><span style="color: hsl(120, 100%, 40%);">+    inet_aton("172.12.101.13", &sin.sin_addr); /* IPv4 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(&ss, 0, sizeof(ss));</span><br><span style="color: hsl(120, 100%, 40%);">+       memcpy(&ss, &sin, sizeof(sin));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     setup_codec_list(&sc_list);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("Testing creating Assignment Request with Kc and LCLS\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ msg = gsm0808_create_ass2(&ct, &cic, &ss, &sc_list, &call_id, Kc, &lcls);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!msgb_eq_l3_data_print(msg, res, ARRAY_SIZE(res)))</span><br><span style="color: hsl(120, 100%, 40%);">+                abort();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void test_create_ass_compl()</span><br><span> {</span><br><span>     static const uint8_t res1[] = {</span><br><span>@@ -1880,6 +1957,7 @@</span><br><span>      test_create_cm_u();</span><br><span>  test_create_sapi_reject();</span><br><span>   test_create_ass();</span><br><span style="color: hsl(120, 100%, 40%);">+    test_create_ass2();</span><br><span>  test_create_ass_compl();</span><br><span>     test_create_ass_compl_aoip();</span><br><span>        test_create_ass_fail();</span><br><span>diff --git a/tests/gsm0808/gsm0808_test.ok b/tests/gsm0808/gsm0808_test.ok</span><br><span>index d5857e3..8e6d262 100644</span><br><span>--- a/tests/gsm0808/gsm0808_test.ok</span><br><span>+++ b/tests/gsm0808/gsm0808_test.ok</span><br><span>@@ -14,6 +14,7 @@</span><br><span> Testing creating CM U</span><br><span> Testing creating SAPI Reject</span><br><span> Testing creating Assignment Request</span><br><span style="color: hsl(120, 100%, 40%);">+Testing creating Assignment Request with Kc and LCLS</span><br><span> Testing creating Assignment Complete</span><br><span> Testing creating Assignment Complete (AoIP)</span><br><span> Testing creating Assignment Failure</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11826">change 11826</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/11826"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: Id89765df3f8c12f55f73f1d7a9d90c8883eb3bba </div>
<div style="display:none"> Gerrit-Change-Number: 11826 </div>
<div style="display:none"> Gerrit-PatchSet: 30 </div>
<div style="display:none"> Gerrit-Owner: Max <msuraev@sysmocom.de> </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: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <stsp@stsp.name> </div>
<div style="display:none"> Gerrit-CC: Vadim Yanitskiy <axilirator@gmail.com> </div>