diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/gsm0808/gsm0808_test.c | 51 | ||||
-rw-r--r-- | tests/gsm0808/gsm0808_test.ok | 6 |
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 |