Max has submitted this change and it was merged. ( 
https://gerrit.osmocom.org/11826 )

Change subject: LCLS: add gsm0808_create_ass2()
......................................................................

LCLS: add gsm0808_create_ass2()

It allows setting additional assignment parameters explicitly.

Change-Id: Id89765df3f8c12f55f73f1d7a9d90c8883eb3bba
Related: OS#2487
---
M include/osmocom/gsm/gsm0808.h
M src/gsm/gsm0808.c
M src/gsm/libosmogsm.map
M tests/gsm0808/gsm0808_test.c
M tests/gsm0808/gsm0808_test.ok
5 files changed, 133 insertions(+), 6 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Stefan Sperling: Looks good to me, but someone else must approve
  Jenkins Builder: Verified



diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h
index e3fb6ad..79d89e5 100644
--- a/include/osmocom/gsm/gsm0808.h
+++ b/include/osmocom/gsm/gsm0808.h
@@ -64,6 +64,12 @@
                                const struct sockaddr_storage *ss,
                                const struct gsm0808_speech_codec_list *scl,
                                const uint32_t *ci);
+struct msgb *gsm0808_create_ass2(const struct gsm0808_channel_type *ct,
+                                const uint16_t *cic,
+                                const struct sockaddr_storage *ss,
+                                const struct gsm0808_speech_codec_list *scl,
+                                const uint32_t *ci,
+                                const uint8_t *kc, const struct osmo_lcls 
*lcls);
 struct msgb *gsm0808_create_ass_compl(uint8_t rr_cause, uint8_t chosen_channel,
                                      uint8_t encr_alg_id, uint8_t speech_mode,
                                      const struct sockaddr_storage *ss,
diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c
index e951ab1..69da57d 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -425,18 +425,22 @@
        return msg;
 }

-/*! Create BSSMAP Assignment Request message, 3GPP TS 48.008 §3.2.1.1
+/*! Create BSSMAP Assignment Request message, 3GPP TS 48.008 §3.2.1.1.
+ *  This is identical to gsm0808_create_ass(), but adds KC and LCLS IEs.
  *  \param[in] ct Channel Type
  *  \param[in] cic Circuit Identity Code (Classic A only)
  *  \param[in] ss Socket Address of MSC-side RTP socket (AoIP only)
  *  \param[in] scl Speech Codec List (AoIP only)
  *  \param[in] ci Call Identifier (Optional), §3.2.2.105
+ *  \param[in] kc Kc128 ciphering key (Optional, A5/4), §3.2.2.109
+ *  \param[in] lcls Optional LCLS parameters
  *  \returns callee-allocated msgb with BSSMAP Assignment Request message */
-struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct,
-                               const uint16_t *cic,
-                               const struct sockaddr_storage *ss,
-                               const struct gsm0808_speech_codec_list *scl,
-                               const uint32_t *ci)
+struct msgb *gsm0808_create_ass2(const struct gsm0808_channel_type *ct,
+                                const uint16_t *cic,
+                                const struct sockaddr_storage *ss,
+                                const struct gsm0808_speech_codec_list *scl,
+                                const uint32_t *ci,
+                                const uint8_t *kc, const struct osmo_lcls 
*lcls)
 {
        /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */
        struct msgb *msg;
@@ -481,6 +485,27 @@
                                  (uint8_t *) & ci_sw);
        }

+       if (kc)
+               msgb_tv_fixed_put(msg, GSM0808_IE_KC_128, 16, kc);
+
+       if (lcls) {
+               /* LCLS: §3.2.2.115 Global Call Reference */
+               if (lcls->gcr)
+                       gsm0808_enc_gcr(msg, lcls->gcr);
+
+               /* LCLS: §3.2.2.116 Configuration */
+               if (lcls->config != GSM0808_LCLS_CFG_NA)
+                       msgb_tv_put(msg, GSM0808_IE_LCLS_CONFIG, lcls->config);
+
+               /* LCLS: §3.2.2.117 Connection Status Control */
+               if (lcls->control != GSM0808_LCLS_CSC_NA)
+                       msgb_tv_put(msg, GSM0808_IE_LCLS_CONN_STATUS_CTRL, 
lcls->control);
+
+               /* LCLS: §3.2.2.118 Correlation-Not-Needed */
+               if (!lcls->corr_needed)
+                       msgb_v_put(msg, GSM0808_IE_LCLS_CORR_NOT_NEEDED);
+       }
+
        /* push the bssmap header */
        msg->l3h =
            msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
@@ -488,6 +513,22 @@
        return msg;
 }

+/*! Create BSSMAP Assignment Request message, 3GPP TS 48.008 §3.2.1.1.
+ *  \param[in] ct Channel Type
+ *  \param[in] cic Circuit Identity Code (Classic A only)
+ *  \param[in] ss Socket Address of MSC-side RTP socket (AoIP only)
+ *  \param[in] scl Speech Codec List (AoIP only)
+ *  \param[in] ci Call Identifier (Optional), §3.2.2.105
+ *  \returns callee-allocated msgb with BSSMAP Assignment Request message */
+struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct,
+                               const uint16_t *cic,
+                               const struct sockaddr_storage *ss,
+                               const struct gsm0808_speech_codec_list *scl,
+                               const uint32_t *ci)
+{
+       return gsm0808_create_ass2(ct, cic, ss, scl, ci, NULL, NULL);
+}
+
 /*! Create BSSMAP Assignment Completed message
  *  \param[in] rr_cause GSM 04.08 RR Cause value
  *  \param[in] chosen_channel Chosen Channel
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index 94ae76a..959d182 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -150,6 +150,7 @@
 gsm0808_cause_name;
 gsm0808_cause_class_name;
 gsm0808_create_ass;
+gsm0808_create_ass2;
 gsm0808_create_assignment_completed;
 gsm0808_create_ass_compl;
 gsm0808_create_assignment_failure;
diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c
index f0f3165..46169ea 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -415,6 +415,83 @@
        msgb_free(msg);
 }

+static void test_create_ass2()
+{
+       static const uint8_t res[] = {
+               BSSAP_MSG_BSS_MANAGEMENT,
+               0x45,
+               BSS_MAP_MSG_ASSIGMENT_RQST,
+               GSM0808_IE_CHANNEL_TYPE,
+               0x04, 0x01, 0x0b, 0x91, 0x15, 0x01, 0x00, 0x04,
+               GSM0808_IE_AOIP_TRASP_ADDR,
+               0x06,
+               0xac, 0x0c, 0x65, 0x0d, /* IPv4 */
+               0x02, 0x9a,
+               GSM0808_IE_SPEECH_CODEC_LIST,
+               0x07,
+               GSM0808_SCT_FR3 | 0x50,
+               0xef, 0xcd,
+               GSM0808_SCT_FR2 | 0xa0,
+               0x9f,
+               GSM0808_SCT_CSD | 0x90,
+               0xc0,
+               GSM0808_IE_CALL_ID,
+               0xde, 0xad, 0xfa, 0xce, /* CallID */
+               0x83, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 
0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, /* Kc */
+               GSM0808_IE_GLOBAL_CALL_REF, 0x0d, /* GCR, length */
+               0x03, 0x44, 0x44, 0x44, /* GCR, Net ID */
+               0x02, 0xfe, 0xed, /* GCR, Node ID */
+               0x05, 0x41, 0x41, 0x41, 0x41, 0x41, /* GCR, Call ref. ID */
+               GSM0808_IE_LCLS_CONFIG, GSM0808_LCLS_CFG_BOTH_WAY,
+               GSM0808_IE_LCLS_CONN_STATUS_CTRL, GSM0808_LCLS_CSC_CONNECT,
+               GSM0808_IE_LCLS_CORR_NOT_NEEDED,
+       };
+       struct msgb *msg;
+       struct gsm0808_channel_type ct;
+       uint16_t cic = 4;
+       struct sockaddr_storage ss;
+       struct sockaddr_in sin;
+       struct gsm0808_speech_codec_list sc_list;
+       uint32_t call_id = 0xDEADFACE;
+       struct osmo_gcr_parsed gcr = { .net_len = 3, .node = 0xFEED };
+       uint8_t Kc[16];
+       struct osmo_lcls lcls = {
+               .config = GSM0808_LCLS_CFG_BOTH_WAY,
+               .control = GSM0808_LCLS_CSC_CONNECT,
+               .gcr = &gcr,
+               .corr_needed = false
+       };
+
+       memset(gcr.cr, 'A', 5);
+       memset(gcr.net, 'D', gcr.net_len);
+       memset(Kc, 'E', 16);
+
+       memset(&ct, 0, sizeof(ct));
+       ct.ch_indctr = GSM0808_CHAN_SPEECH;
+       ct.ch_rate_type = GSM0808_SPEECH_HALF_PREF;
+       ct.perm_spch[0] = GSM0808_PERM_FR2;
+       ct.perm_spch[1] = GSM0808_PERM_HR2;
+       ct.perm_spch_len = 2;
+
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_family = AF_INET;
+       sin.sin_port = htons(666);
+       inet_aton("172.12.101.13", &sin.sin_addr); /* IPv4 */
+
+       memset(&ss, 0, sizeof(ss));
+       memcpy(&ss, &sin, sizeof(sin));
+
+       setup_codec_list(&sc_list);
+
+       printf("Testing creating Assignment Request with Kc and LCLS\n");
+
+       msg = gsm0808_create_ass2(&ct, &cic, &ss, &sc_list, &call_id, Kc, 
&lcls);
+       if (!msgb_eq_l3_data_print(msg, res, ARRAY_SIZE(res)))
+               abort();
+
+       msgb_free(msg);
+}
+
 static void test_create_ass_compl()
 {
        static const uint8_t res1[] = {
@@ -1880,6 +1957,7 @@
        test_create_cm_u();
        test_create_sapi_reject();
        test_create_ass();
+       test_create_ass2();
        test_create_ass_compl();
        test_create_ass_compl_aoip();
        test_create_ass_fail();
diff --git a/tests/gsm0808/gsm0808_test.ok b/tests/gsm0808/gsm0808_test.ok
index d5857e3..8e6d262 100644
--- a/tests/gsm0808/gsm0808_test.ok
+++ b/tests/gsm0808/gsm0808_test.ok
@@ -14,6 +14,7 @@
 Testing creating CM U
 Testing creating SAPI Reject
 Testing creating Assignment Request
+Testing creating Assignment Request with Kc and LCLS
 Testing creating Assignment Complete
 Testing creating Assignment Complete (AoIP)
 Testing creating Assignment Failure

--
To view, visit https://gerrit.osmocom.org/11826
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Id89765df3f8c12f55f73f1d7a9d90c8883eb3bba
Gerrit-Change-Number: 11826
Gerrit-PatchSet: 30
Gerrit-Owner: Max <msur...@sysmocom.de>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder (1000002)
Gerrit-Reviewer: Max <msur...@sysmocom.de>
Gerrit-Reviewer: Neels Hofmeyr <nhofm...@sysmocom.de>
Gerrit-Reviewer: Pau Espin Pedrol <pes...@sysmocom.de>
Gerrit-Reviewer: Stefan Sperling <s...@stsp.name>
Gerrit-CC: Vadim Yanitskiy <axilira...@gmail.com>

Reply via email to