aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorAlexander Chemeris <Alexander.Chemeris@gmail.com>2020-05-13 00:44:04 +0300
committerlaforge <laforge@osmocom.org>2020-05-17 07:32:32 +0000
commit22630e68279525fd9684c8016f7443a8aba1f2a5 (patch)
tree649151c3e1e0af09c6514d2509fea03c1dc1c7e5 /tests
parentbfeeb1c86ce473ff3811513f02a307c969531c5f (diff)
gsm0808: Implement helper functions for CONFUSION BSSMAP message decoding.
Also add a test for an actual CONFUSION message parsing. Change-Id: If8afd2d096fb66c6c2f255a08fc1129de3d09cec
Diffstat (limited to 'tests')
-rw-r--r--tests/gsm0808/gsm0808_test.c51
-rw-r--r--tests/gsm0808/gsm0808_test.ok6
2 files changed, 57 insertions, 0 deletions
diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c
index ce733901..d9640aa3 100644
--- a/tests/gsm0808/gsm0808_test.c
+++ b/tests/gsm0808/gsm0808_test.c
@@ -379,6 +379,55 @@ static void test_create_sapi_reject()
msgb_free(msg);
}
+static void test_dec_confusion()
+{
+ static const uint8_t hex[] =
+ { 0x26, 0x04, 0x01, 0x52, 0x1f, 0x07, 0x00, 0xff, 0x00, 0x03, 0x25, 0x03, 0x25 };
+ struct tlv_parsed tp;
+ int diag_len;
+ enum gsm0808_cause cause;
+ enum gsm0808_cause_class cause_class;
+ struct gsm0808_diagnostics *diag;
+
+ printf("Testing decoding CONFUSION\n");
+
+ tlv_parse(&tp, gsm0808_att_tlvdef(), hex+1, sizeof(hex)-1, 0, 0);
+
+ /* Check for the Cause and Diagnostic mandatory elements */
+ if (!TLVP_PRESENT(&tp, GSM0808_IE_CAUSE) || !TLVP_PRESENT(&tp, GSM0808_IE_DIAGNOSTIC)) {
+ printf("Either Cause or Diagnostic mandatory IE are not detected\n");
+ return;
+ }
+
+ diag_len = TLVP_LEN(&tp, GSM0808_IE_DIAGNOSTIC);
+ if (diag_len < 5) {
+ printf("Diagnostic length is too short: %d (expected > 5)\n",
+ diag_len);
+ return;
+ }
+
+ cause = gsm0808_get_cause(&tp);
+ if ((int)cause < 0) {
+ printf("ERROR: failed (%s) to extract Cause, aborting\n", strerror(-(int)cause));
+ return;
+ }
+ cause_class = gsm0808_cause_class(cause);
+ printf(" Cause class %d/0x%x (%s)\n",
+ cause_class, cause_class, gsm0808_cause_class_name(cause_class));
+ printf(" Cause %d/0x%x (%s)\n",
+ cause, cause, gsm0808_cause_name(cause));
+
+ diag = (struct gsm0808_diagnostics *)TLVP_VAL(&tp, GSM0808_IE_DIAGNOSTIC);
+ printf(" Diagnostics error octet location %d (%s)\n",
+ diag->error_pointer_octet,
+ gsm0808_diagnostics_octet_location_str(diag->error_pointer_octet));
+ printf(" Diagnostics error bit location %d (%s)\n",
+ diag->error_pointer_bit,
+ gsm0808_diagnostics_bit_location_str(diag->error_pointer_bit));
+ printf(" Diagnostics message that provoked the error: %s\n",
+ osmo_hexdump(diag->msg, diag_len-2));
+}
+
static void test_create_ass()
{
static const uint8_t res1[] =
@@ -2422,6 +2471,8 @@ int main(int argc, char **argv)
test_gsm0808_cell_id_to_from_cgi();
+ test_dec_confusion();
+
printf("Done\n");
return EXIT_SUCCESS;
}
diff --git a/tests/gsm0808/gsm0808_test.ok b/tests/gsm0808/gsm0808_test.ok
index b620e369..eaae7a69 100644
--- a/tests/gsm0808/gsm0808_test.ok
+++ b/tests/gsm0808/gsm0808_test.ok
@@ -910,4 +910,10 @@ cid unknown 0x1a7:unknown 0x1a7 -> cgi 777-007-7777-7777 -> cid unknown 0x1a7:un
--> gsm0808_cell_id{LAC-CI} = LAC-CI:7777-7777
--> gsm0808_cell_id{LAI} = LAI:777-007-7777
--> gsm0808_cell_id{CGI} = CGI:777-007-7777-7777
+Testing decoding CONFUSION
+ Cause class 5/0x5 (Invalid message)
+ Cause 82/0x52 (INFORMATION ELEMENT OR FIELD MISSING)
+ Diagnostics error octet location 0 (Error location not determined)
+ Diagnostics error bit location 15 (Reserved value)
+ Diagnostics message that provoked the error: 00 03 25 03 25
Done