LCLS: add gsm0808_create_ass2()

It allows setting additional assignment parameters explicitly.

Change-Id: Id89765df3f8c12f55f73f1d7a9d90c8883eb3bba
Related: OS#2487
This commit is contained in:
Max 2018-11-30 10:44:07 +01:00
parent 969fb2ed84
commit 5207432780
5 changed files with 133 additions and 6 deletions

View File

@ -64,6 +64,12 @@ struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct,
const struct sockaddr_storage *ss, const struct sockaddr_storage *ss,
const struct gsm0808_speech_codec_list *scl, const struct gsm0808_speech_codec_list *scl,
const uint32_t *ci); 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, struct msgb *gsm0808_create_ass_compl(uint8_t rr_cause, uint8_t chosen_channel,
uint8_t encr_alg_id, uint8_t speech_mode, uint8_t encr_alg_id, uint8_t speech_mode,
const struct sockaddr_storage *ss, const struct sockaddr_storage *ss,

View File

@ -425,18 +425,22 @@ struct msgb *gsm0808_create_sapi_reject(uint8_t link_id)
return msg; 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] ct Channel Type
* \param[in] cic Circuit Identity Code (Classic A only) * \param[in] cic Circuit Identity Code (Classic A only)
* \param[in] ss Socket Address of MSC-side RTP socket (AoIP only) * \param[in] ss Socket Address of MSC-side RTP socket (AoIP only)
* \param[in] scl Speech Codec List (AoIP only) * \param[in] scl Speech Codec List (AoIP only)
* \param[in] ci Call Identifier (Optional), §3.2.2.105 * \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 */ * \returns callee-allocated msgb with BSSMAP Assignment Request message */
struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct, struct msgb *gsm0808_create_ass2(const struct gsm0808_channel_type *ct,
const uint16_t *cic, const uint16_t *cic,
const struct sockaddr_storage *ss, const struct sockaddr_storage *ss,
const struct gsm0808_speech_codec_list *scl, const struct gsm0808_speech_codec_list *scl,
const uint32_t *ci) 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 */ /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */
struct msgb *msg; struct msgb *msg;
@ -481,6 +485,27 @@ struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct,
(uint8_t *) & ci_sw); (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 */ /* push the bssmap header */
msg->l3h = msg->l3h =
msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg)); msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
@ -488,6 +513,22 @@ struct msgb *gsm0808_create_ass(const struct gsm0808_channel_type *ct,
return msg; 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 /*! Create BSSMAP Assignment Completed message
* \param[in] rr_cause GSM 04.08 RR Cause value * \param[in] rr_cause GSM 04.08 RR Cause value
* \param[in] chosen_channel Chosen Channel * \param[in] chosen_channel Chosen Channel

View File

@ -150,6 +150,7 @@ gsm0808_bssmap_name;
gsm0808_cause_name; gsm0808_cause_name;
gsm0808_cause_class_name; gsm0808_cause_class_name;
gsm0808_create_ass; gsm0808_create_ass;
gsm0808_create_ass2;
gsm0808_create_assignment_completed; gsm0808_create_assignment_completed;
gsm0808_create_ass_compl; gsm0808_create_ass_compl;
gsm0808_create_assignment_failure; gsm0808_create_assignment_failure;

View File

@ -415,6 +415,83 @@ static void test_create_ass()
msgb_free(msg); 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 void test_create_ass_compl()
{ {
static const uint8_t res1[] = { static const uint8_t res1[] = {
@ -1880,6 +1957,7 @@ int main(int argc, char **argv)
test_create_cm_u(); test_create_cm_u();
test_create_sapi_reject(); test_create_sapi_reject();
test_create_ass(); test_create_ass();
test_create_ass2();
test_create_ass_compl(); test_create_ass_compl();
test_create_ass_compl_aoip(); test_create_ass_compl_aoip();
test_create_ass_fail(); test_create_ass_fail();

View File

@ -14,6 +14,7 @@ Testing creating Cipher Reject (extended)
Testing creating CM U Testing creating CM U
Testing creating SAPI Reject Testing creating SAPI Reject
Testing creating Assignment Request Testing creating Assignment Request
Testing creating Assignment Request with Kc and LCLS
Testing creating Assignment Complete Testing creating Assignment Complete
Testing creating Assignment Complete (AoIP) Testing creating Assignment Complete (AoIP)
Testing creating Assignment Failure Testing creating Assignment Failure