[MERGED] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

2017-04-08 Thread Harald Welte
Harald Welte has submitted this change and it was merged.

Change subject: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST
..


gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages.
These messages are required if the code is used in an MSC implementation.

This commit adds a gsm0808_create_assignment() function, that generates an
A/AoiP BSS_MAP_MSG_PAGING message.

Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0
---
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, 113 insertions(+), 0 deletions(-)

Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified



diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h
index 990fd74..a9f610a 100644
--- a/include/osmocom/gsm/gsm0808.h
+++ b/include/osmocom/gsm/gsm0808.h
@@ -42,6 +42,11 @@
 struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t 
cm2_len,
 const uint8_t *cm3, uint8_t 
cm3_len);
 struct msgb *gsm0808_create_sapi_reject(uint8_t link_id);
+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_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 2721a1b..be58939 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -238,6 +238,62 @@
return msg;
 }
 
+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)
+{
+   /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */
+   struct msgb *msg;
+   uint16_t cic_sw;
+   uint32_t ci_sw;
+
+   /* Mandatory emelent! */
+   OSMO_ASSERT(ct);
+
+   msg =
+   msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+   "bssmap: ass req");
+   if (!msg)
+   return NULL;
+
+   /* Message Type 3.2.2.1 */
+   msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST);
+
+   /* Channel Type 3.2.2.11 */
+   gsm0808_enc_channel_type(msg, ct);
+
+   /* Circuit Identity Code 3.2.2.2  */
+   if (cic) {
+   cic_sw = htons(*cic);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE,
+ sizeof(cic_sw), (uint8_t *) & cic_sw);
+   }
+
+   /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */
+   if (ss) {
+   gsm0808_enc_aoip_trasp_addr(msg, ss);
+   }
+
+   /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */
+   if (scl)
+   gsm0808_enc_speech_codec_list(msg, scl);
+
+   /* AoIP: Call Identifier 3.2.2.105 */
+   if (ci) {
+   ci_sw = htonl(*ci);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw),
+ (uint8_t *) & ci_sw);
+   }
+
+   /* push the bssmap header */
+   msg->l3h =
+   msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
+
+   return msg;
+}
+
 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/libosmogsm.map b/src/gsm/libosmogsm.map
index ec23418..a4e6083 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -124,6 +124,7 @@
 gsm0808_att_tlvdef;
 gsm0808_bssap_name;
 gsm0808_bssmap_name;
+gsm0808_create_ass;
 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 b0dad7d..a0ff6d5 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -262,6 +262,55 @@
msgb_free(msg);
 }
 
+static void test_create_ass()
+{
+   static const uint8_t res1[] =
+   { 0x00, 0x0a, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
+ 0x04 };
+   static const uint8_t res2[] =
+   { 0x00, 0x20, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
+ 0x04, 

libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

2017-04-05 Thread Harald Welte

Patch Set 6: Code-Review+2

-- 
To view, visit https://gerrit.osmocom.org/2184
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0
Gerrit-PatchSet: 6
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: dexter 
Gerrit-Reviewer: Harald Welte 
Gerrit-Reviewer: Jenkins Builder
Gerrit-HasComments: No


[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

2017-04-05 Thread dexter
Hello Harald Welte, Jenkins Builder,

I'd like you to reexamine a change.  Please visit

https://gerrit.osmocom.org/2184

to look at the new patch set (#6).

gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages.
These messages are required if the code is used in an MSC implementation.

This commit adds a gsm0808_create_assignment() function, that generates an
A/AoiP BSS_MAP_MSG_PAGING message.

Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0
---
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, 113 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/6

diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h
index 990fd74..a9f610a 100644
--- a/include/osmocom/gsm/gsm0808.h
+++ b/include/osmocom/gsm/gsm0808.h
@@ -42,6 +42,11 @@
 struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t 
cm2_len,
 const uint8_t *cm3, uint8_t 
cm3_len);
 struct msgb *gsm0808_create_sapi_reject(uint8_t link_id);
+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_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 2721a1b..be58939 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -238,6 +238,62 @@
return msg;
 }
 
+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)
+{
+   /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */
+   struct msgb *msg;
+   uint16_t cic_sw;
+   uint32_t ci_sw;
+
+   /* Mandatory emelent! */
+   OSMO_ASSERT(ct);
+
+   msg =
+   msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+   "bssmap: ass req");
+   if (!msg)
+   return NULL;
+
+   /* Message Type 3.2.2.1 */
+   msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST);
+
+   /* Channel Type 3.2.2.11 */
+   gsm0808_enc_channel_type(msg, ct);
+
+   /* Circuit Identity Code 3.2.2.2  */
+   if (cic) {
+   cic_sw = htons(*cic);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE,
+ sizeof(cic_sw), (uint8_t *) & cic_sw);
+   }
+
+   /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */
+   if (ss) {
+   gsm0808_enc_aoip_trasp_addr(msg, ss);
+   }
+
+   /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */
+   if (scl)
+   gsm0808_enc_speech_codec_list(msg, scl);
+
+   /* AoIP: Call Identifier 3.2.2.105 */
+   if (ci) {
+   ci_sw = htonl(*ci);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw),
+ (uint8_t *) & ci_sw);
+   }
+
+   /* push the bssmap header */
+   msg->l3h =
+   msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
+
+   return msg;
+}
+
 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/libosmogsm.map b/src/gsm/libosmogsm.map
index ec23418..a4e6083 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -124,6 +124,7 @@
 gsm0808_att_tlvdef;
 gsm0808_bssap_name;
 gsm0808_bssmap_name;
+gsm0808_create_ass;
 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 b0dad7d..a0ff6d5 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -262,6 +262,55 @@
msgb_free(msg);
 }
 
+static void test_create_ass()
+{
+   static const uint8_t res1[] =
+   { 0x00, 0x0a, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
+ 0x04 };
+   static const uint8_t res2[] =
+   { 0x00, 0x20, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
+ 0x04, GSM0808_IE_AOIP_TRASP_ADDR, 0x06, 0xc0, 0xa8, 0x64, 0x17,
+ 

libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

2017-04-04 Thread Harald Welte

Patch Set 5: Code-Review+1

(1 comment)

https://gerrit.osmocom.org/#/c/2184/5/include/osmocom/gsm/gsm0808.h
File include/osmocom/gsm/gsm0808.h:

Line 44: struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct,
again const?


-- 
To view, visit https://gerrit.osmocom.org/2184
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: comment
Gerrit-Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0
Gerrit-PatchSet: 5
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Owner: dexter 
Gerrit-Reviewer: Harald Welte 
Gerrit-Reviewer: Jenkins Builder
Gerrit-HasComments: Yes


[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

2017-04-04 Thread dexter
Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

https://gerrit.osmocom.org/2184

to look at the new patch set (#4).

gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages.
These messages are required if the code is used in an MSC implementation.

This commit adds a gsm0808_create_assignment() function, that generates an
A/AoiP BSS_MAP_MSG_PAGING message.

Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0
---
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, 113 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/4

diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h
index db9a505..031215e 100644
--- a/include/osmocom/gsm/gsm0808.h
+++ b/include/osmocom/gsm/gsm0808.h
@@ -41,6 +41,11 @@
 struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t 
cm2_len,
 const uint8_t *cm3, uint8_t 
cm3_len);
 struct msgb *gsm0808_create_sapi_reject(uint8_t link_id);
+struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct,
+  uint16_t * cic,
+  struct sockaddr_storage *ss,
+  struct gsm0808_speech_codec_list *scl,
+  uint32_t * ci);
 struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause,
  uint8_t chosen_channel,
  uint8_t encr_alg_id,
diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c
index 01d54ef..fd0bf2e 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -238,6 +238,62 @@
return msg;
 }
 
+struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct,
+  uint16_t *cic,
+  struct sockaddr_storage *ss,
+  struct gsm0808_speech_codec_list *scl,
+  uint32_t *ci)
+{
+   /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */
+   struct msgb *msg;
+   uint16_t cic_sw;
+   uint32_t ci_sw;
+
+   /* Mandatory emelent! */
+   OSMO_ASSERT(ct);
+
+   msg =
+   msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+   "bssmap: ass req");
+   if (!msg)
+   return NULL;
+
+   /* Message Type 3.2.2.1 */
+   msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST);
+
+   /* Channel Type 3.2.2.11 */
+   gsm0808_enc_channel_type(msg, ct);
+
+   /* Circuit Identity Code 3.2.2.2  */
+   if (cic) {
+   cic_sw = htons(*cic);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE,
+ sizeof(cic_sw), (uint8_t *) & cic_sw);
+   }
+
+   /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */
+   if (ss) {
+   gsm0808_enc_aoip_trasp_addr(msg, ss);
+   }
+
+   /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */
+   if (scl)
+   gsm0808_enc_speech_codec_list(msg, scl);
+
+   /* AoIP: Call Identifier 3.2.2.105 */
+   if (ci) {
+   ci_sw = htonl(*ci);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw),
+ (uint8_t *) & ci_sw);
+   }
+
+   /* push the bssmap header */
+   msg->l3h =
+   msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
+
+   return msg;
+}
+
 struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause,
  uint8_t chosen_channel,
  uint8_t encr_alg_id,
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index fb06bff..fcd13d1 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -124,6 +124,7 @@
 gsm0808_att_tlvdef;
 gsm0808_bssap_name;
 gsm0808_bssmap_name;
+gsm0808_create_assignment;
 gsm0808_create_assignment_completed;
 gsm0808_create_assignment_completed_aoip;
 gsm0808_create_assignment_failure;
diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c
index 02de5e1..521ae24 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -262,6 +262,55 @@
msgb_free(msg);
 }
 
+static void test_create_ass()
+{
+   static const uint8_t res1[] =
+   { 0x00, 0x0a, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
+ 0x04 };
+   static const uint8_t res2[] =
+   { 0x00, 0x20, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
+ 0x04, GSM0808_IE_AOIP_TRASP_ADDR, 0x06, 0xc0, 0xa8, 0x64, 0x17,
+ 

[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

2017-04-04 Thread dexter
Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

https://gerrit.osmocom.org/2184

to look at the new patch set (#3).

gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages.
These messages are required if the code is used in an MSC implementation.

This commit adds a gsm0808_create_assignment() function, that generates an
A/AoiP BSS_MAP_MSG_PAGING message.

Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0
---
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, 115 insertions(+), 11 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/3

diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h
index db9a505..031215e 100644
--- a/include/osmocom/gsm/gsm0808.h
+++ b/include/osmocom/gsm/gsm0808.h
@@ -41,6 +41,11 @@
 struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t 
cm2_len,
 const uint8_t *cm3, uint8_t 
cm3_len);
 struct msgb *gsm0808_create_sapi_reject(uint8_t link_id);
+struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct,
+  uint16_t * cic,
+  struct sockaddr_storage *ss,
+  struct gsm0808_speech_codec_list *scl,
+  uint32_t * ci);
 struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause,
  uint8_t chosen_channel,
  uint8_t encr_alg_id,
diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c
index daed85c..fd0bf2e 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -238,6 +238,62 @@
return msg;
 }
 
+struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct,
+  uint16_t *cic,
+  struct sockaddr_storage *ss,
+  struct gsm0808_speech_codec_list *scl,
+  uint32_t *ci)
+{
+   /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */
+   struct msgb *msg;
+   uint16_t cic_sw;
+   uint32_t ci_sw;
+
+   /* Mandatory emelent! */
+   OSMO_ASSERT(ct);
+
+   msg =
+   msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+   "bssmap: ass req");
+   if (!msg)
+   return NULL;
+
+   /* Message Type 3.2.2.1 */
+   msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST);
+
+   /* Channel Type 3.2.2.11 */
+   gsm0808_enc_channel_type(msg, ct);
+
+   /* Circuit Identity Code 3.2.2.2  */
+   if (cic) {
+   cic_sw = htons(*cic);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE,
+ sizeof(cic_sw), (uint8_t *) & cic_sw);
+   }
+
+   /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */
+   if (ss) {
+   gsm0808_enc_aoip_trasp_addr(msg, ss);
+   }
+
+   /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */
+   if (scl)
+   gsm0808_enc_speech_codec_list(msg, scl);
+
+   /* AoIP: Call Identifier 3.2.2.105 */
+   if (ci) {
+   ci_sw = htonl(*ci);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw),
+ (uint8_t *) & ci_sw);
+   }
+
+   /* push the bssmap header */
+   msg->l3h =
+   msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
+
+   return msg;
+}
+
 struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause,
  uint8_t chosen_channel,
  uint8_t encr_alg_id,
@@ -365,7 +421,6 @@
   uint8_t *chan_needed)
 {
struct msgb *msg;
-   struct msgb *cil_encoded;
uint8_t mid_buf[GSM48_MI_SIZE + 2];
int mid_len;
uint32_t tmsi_sw;
@@ -397,16 +452,8 @@
}
 
/* Cell Identifier List 3.2.2.27 */
-   if (cil) {
-   cil_encoded = gsm0808_enc_cell_id_list(cil);
-   if (!cil_encoded) {
-   msgb_free(msg);
-   return NULL;
-   }
-   msgb_tlv_put(msg, GSM0808_IE_CELL_IDENTIFIER_LIST,
-cil_encoded->len, cil_encoded->data);
-   msgb_free(cil_encoded);
-   }
+   if (cil)
+   gsm0808_enc_cell_id_list(msg, cil);
 
/* Channel Needed 3.2.2.36 */
if (chan_needed) {
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index fb06bff..fcd13d1 100644
--- a/src/gsm/libosmogsm.map
+++ 

[PATCH] libosmocore[master]: gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

2017-03-30 Thread dexter

Review at  https://gerrit.osmocom.org/2184

gsm0808: Add create functions for BSS_MAP_MSG_ASSIGMENT_RQST

gsm0808.h/c lacks functionality to generate BSS_MAP_MSG_ASSIGMENT_RQST messages.
These messages are required if the code is used in an MSC implementation.

This commit adds a gsm0808_create_assignment() function, that generates an
A/AoiP BSS_MAP_MSG_PAGING message.

Change-Id: I4d1d455a1e1cf95407e23ded7b7defbcf2dd6ff0
---
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, 138 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/84/2184/1

diff --git a/include/osmocom/gsm/gsm0808.h b/include/osmocom/gsm/gsm0808.h
index 6cd933b..aa8148a 100644
--- a/include/osmocom/gsm/gsm0808.h
+++ b/include/osmocom/gsm/gsm0808.h
@@ -41,6 +41,11 @@
 struct msgb *gsm0808_create_classmark_update(const uint8_t *cm2, uint8_t 
cm2_len,
 const uint8_t *cm3, uint8_t 
cm3_len);
 struct msgb *gsm0808_create_sapi_reject(uint8_t link_id);
+struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct,
+  uint16_t *cic,
+  struct sockaddr_storage *ss,
+  struct llist_head *scl,
+  uint32_t *ci);
 struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause,
  uint8_t chosen_channel,
  uint8_t encr_alg_id,
diff --git a/src/gsm/gsm0808.c b/src/gsm/gsm0808.c
index b6ae0fa..b43e2eb 100644
--- a/src/gsm/gsm0808.c
+++ b/src/gsm/gsm0808.c
@@ -255,6 +255,86 @@
return msg;
 }
 
+struct msgb *gsm0808_create_assignment(struct gsm0808_channel_type *ct,
+  uint16_t *cic,
+  struct sockaddr_storage *ss,
+  struct llist_head *scl, uint32_t *ci)
+{
+   /* See also: 3GPP TS 48.008 3.2.1.1 ASSIGNMENT REQUEST */
+   struct msgb *msg;
+   struct msgb *ct_encoded;
+   uint16_t cic_sw;
+   struct msgb *ss_encoded;
+   struct msgb *scl_encoded;
+   uint32_t ci_sw;
+
+   /* Mandatory emelent! */
+   OSMO_ASSERT(ct);
+
+   msg =
+   msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM,
+   "bssmap: ass req");
+   if (!msg)
+   return NULL;
+
+   /* Message Type 3.2.2.1 */
+   msgb_v_put(msg, BSS_MAP_MSG_ASSIGMENT_RQST);
+
+   /* Channel Type 3.2.2.11 */
+   ct_encoded = gsm0808_enc_channel_type(ct);
+   if (!ct_encoded) {
+   msgb_free(msg);
+   return NULL;
+   }
+   msgb_tlv_put(msg, GSM0808_IE_CHANNEL_TYPE, ct_encoded->len,
+ct_encoded->data);
+   msgb_free(ct_encoded);
+
+   /* Circuit Identity Code 3.2.2.2  */
+   if (cic) {
+   cic_sw = htons(*cic);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CIRCUIT_IDENTITY_CODE,
+ sizeof(cic_sw), (uint8_t *) & cic_sw);
+   }
+
+   /* AoIP: AoIP Transport Layer Address (MGW) 3.2.2.102 */
+   if (ss) {
+   ss_encoded = gsm0808_enc_aoip_trasp_addr(ss);
+   if (!ss_encoded) {
+   msgb_free(msg);
+   return NULL;
+   }
+   msgb_tlv_put(msg, GSM0808_IE_AOIP_TRASP_ADDR,
+ss_encoded->len, ss_encoded->data);
+   msgb_free(ss_encoded);
+   }
+
+   /* AoIP: Codec List (MSC Preferred) 3.2.2.103 */
+   if (scl) {
+   scl_encoded = gsm0808_enc_speech_codec_list(scl);
+   if (!scl_encoded) {
+   msgb_free(msg);
+   return NULL;
+   }
+   msgb_tlv_put(msg, GSM0808_IE_SPEECH_CODEC_LIST,
+scl_encoded->len, scl_encoded->data);
+   msgb_free(scl_encoded);
+   }
+
+   /* AoIP: Call Identifier 3.2.2.105 */
+   if (ci) {
+   ci_sw = htonl(*ci);
+   msgb_tv_fixed_put(msg, GSM0808_IE_CALL_ID, sizeof(ci_sw),
+ (uint8_t *) & ci_sw);
+   }
+
+   /* push the bssmap header */
+   msg->l3h =
+   msgb_tv_push(msg, BSSAP_MSG_BSS_MANAGEMENT, msgb_length(msg));
+
+   return msg;
+}
+
 struct msgb *gsm0808_create_assignment_completed_aoip(uint8_t rr_cause,
  uint8_t chosen_channel,
  uint8_t encr_alg_id,
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index fb06bff..fcd13d1 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -124,6 +124,7 @@