diff options
Diffstat (limited to 'tests/bssmap_le')
-rw-r--r-- | tests/bssmap_le/bssmap_le_test.c | 207 | ||||
-rw-r--r-- | tests/bssmap_le/bssmap_le_test.ok | 12 |
2 files changed, 219 insertions, 0 deletions
diff --git a/tests/bssmap_le/bssmap_le_test.c b/tests/bssmap_le/bssmap_le_test.c new file mode 100644 index 00000000..a14c38a3 --- /dev/null +++ b/tests/bssmap_le/bssmap_le_test.c @@ -0,0 +1,207 @@ +#include <stdio.h> + +#include <osmocom/core/utils.h> +#include <osmocom/gsm/bssmap_le.h> + +struct bssmap_le_pdu bssmap_le_test_pdus[] = { + { + .msg_type = BSSMAP_LE_MSGT_RESET, + .reset = GSM0808_CAUSE_EQUIPMENT_FAILURE, + }, + { + .msg_type = BSSMAP_LE_MSGT_RESET_ACK, + }, + { + .msg_type = BSSMAP_LE_MSGT_PERFORM_LOC_REQ, + .perform_loc_req = { + .location_type = { + .location_information = BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC, + }, + + .cell_id = { + .id_discr = CELL_IDENT_LAC_AND_CI, + .id.lac_and_ci = { + .lac = 23, + .ci = 42, + }, + }, + + .lcs_client_type_present = true, + .lcs_client_type = BSSMAP_LE_LCS_CTYPE_VALUE_ADDED_UNSPECIFIED, + + .imsi = { + .type = GSM_MI_TYPE_IMSI, + .imsi = "1234567890", + }, + + .imei = { + .type = GSM_MI_TYPE_IMEI, + .imei = "123456789012345", + }, + + .apdu_present = true, + .apdu = { + .msg_type = BSSLAP_MSGT_TA_LAYER3, + .ta_layer3 = { + .ta = 23, + }, + }, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_PERFORM_LOC_RESP, + .perform_loc_resp = { + .location_estimate_present = true, + .location_estimate = { + .ell_point_unc_circle = { + .h = { .type = GAD_TYPE_ELL_POINT_UNC_CIRCLE }, + .lat = { 1, 2, 3 }, + .lon = { 4, 5, 6 }, + .unc = 123, + }, + }, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_PERFORM_LOC_RESP, + .perform_loc_resp = { + .lcs_cause = { + .present = true, + .cause_val = LCS_CAUSE_REQUEST_ABORTED, + }, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_PERFORM_LOC_RESP, + .perform_loc_resp = { + .lcs_cause = { + .present = true, + .cause_val = LCS_CAUSE_POS_METH_FAILURE, + .diag_val_present = true, + .diag_val = 23, + }, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_PERFORM_LOC_ABORT, + .perform_loc_abort = { + .present = true, + .cause_val = LCS_CAUSE_REQUEST_ABORTED, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_CONN_ORIENTED_INFO, + .conn_oriented_info = { + .apdu = { + .msg_type = BSSLAP_MSGT_TA_REQUEST, + }, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_CONN_ORIENTED_INFO, + .conn_oriented_info = { + .apdu = { + .msg_type = BSSLAP_MSGT_TA_RESPONSE, + .ta_response = { + .cell_id = 23, + .ta = 42, + }, + }, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_CONN_ORIENTED_INFO, + .conn_oriented_info = { + .apdu = { + .msg_type = BSSLAP_MSGT_REJECT, + .reject = BSSLAP_CAUSE_CONGESTION, + }, + }, + }, + { + .msg_type = BSSMAP_LE_MSGT_PERFORM_LOC_REQ, + .perform_loc_req = { + .location_type = { + .location_information = BSSMAP_LE_LOC_INFO_CURRENT_GEOGRAPHIC, + }, + + .cell_id = { + .id_discr = CELL_IDENT_LAC_AND_CI, + .id.lac_and_ci = { + .lac = 23, + .ci = 42, + }, + }, + + .lcs_client_type_present = true, + .lcs_client_type = BSSMAP_LE_LCS_CTYPE_EMERG_SVC_UNSPECIFIED, + + .more_items = true, + + .lcs_priority_present = true, + .lcs_priority = 0x00, /* highest */ + + .lcs_qos_present = true, + .lcs_qos = { + .ha_ind = 1, + .ha_val = 0x12, + }, + }, + }, +}; + +void test_bssmap_le_enc_dec(void) +{ + struct bssmap_le_pdu *pdu; + printf("--- %s\n", __func__); + + for (pdu = bssmap_le_test_pdus; (pdu - bssmap_le_test_pdus) < ARRAY_SIZE(bssmap_le_test_pdus); pdu++) { + struct msgb *msg; + struct bssap_le_pdu enc_pdu = { + .discr = BSSAP_LE_MSG_DISCR_BSSMAP_LE, + .bssmap_le = *pdu, + }; + struct bssap_le_pdu dec_pdu; + struct osmo_bssap_le_err *err = NULL; + void *loop_ctx; + int rc; + + msg = osmo_bssap_le_enc(&enc_pdu); + if (!msg) { + printf("[%td] %s: ERROR: failed to encode pdu\n", (pdu - bssmap_le_test_pdus), + osmo_bssmap_le_msgt_name(pdu->msg_type)); + goto loop_end; + } + loop_ctx = msg; + + memset(&dec_pdu, 0xff, sizeof(dec_pdu)); + rc = osmo_bssap_le_dec(&dec_pdu, &err, loop_ctx, msg); + if (rc) { + printf("[%td] %s: ERROR: failed to decode pdu: %s\n", (pdu - bssmap_le_test_pdus), + osmo_bssmap_le_msgt_name(pdu->msg_type), err->logmsg); + printf(" encoded data: %s\n", osmo_hexdump(msg->data, msg->len)); + goto loop_end; + } + + if (memcmp(&enc_pdu, &dec_pdu, sizeof(dec_pdu))) { + printf("[%td] %s: ERROR: decoded PDU != encoded PDU\n", (pdu - bssmap_le_test_pdus), + osmo_bssmap_le_msgt_name(pdu->msg_type)); + printf(" original struct: %s\n", osmo_hexdump((void*)&enc_pdu, sizeof(enc_pdu))); + printf(" decoded struct: %s\n", osmo_hexdump((void*)&dec_pdu, sizeof(dec_pdu))); + printf(" encoded data: %s\n", osmo_hexdump(msg->data, msg->len)); + goto loop_end; + } + + printf("[%td] %s: ok (encoded len = %d)\n", (pdu - bssmap_le_test_pdus), + osmo_bssmap_le_msgt_name(pdu->msg_type), msg->len); + +loop_end: + msgb_free(msg); + } +} + +int main(int argc, char **argv) +{ + test_bssmap_le_enc_dec(); + return 0; +} diff --git a/tests/bssmap_le/bssmap_le_test.ok b/tests/bssmap_le/bssmap_le_test.ok new file mode 100644 index 00000000..8cc77039 --- /dev/null +++ b/tests/bssmap_le/bssmap_le_test.ok @@ -0,0 +1,12 @@ +--- test_bssmap_le_enc_dec +[0] RESET: ok (encoded len = 6) +[1] RESET ACKNOWLEDGE: ok (encoded len = 3) +[2] PERFORM LOCATION REQUEST: ok (encoded len = 41) +[3] PERFORM LOCATION RESPONSE: ok (encoded len = 13) +[4] PERFORM LOCATION RESPONSE: ok (encoded len = 6) +[5] PERFORM LOCATION RESPONSE: ok (encoded len = 7) +[6] PERFORM LOCATION ABORT: ok (encoded len = 6) +[7] CONNECTION ORIENTED INFORMATON: ok (encoded len = 8) +[8] CONNECTION ORIENTED INFORMATON: ok (encoded len = 13) +[9] CONNECTION ORIENTED INFORMATON: ok (encoded len = 10) +[10] PERFORM LOCATION REQUEST: ok (encoded len = 25) |