mirror of https://gerrit.osmocom.org/libosmocore
800 lines
25 KiB
C
800 lines
25 KiB
C
/* Test routines for the BSSGP implementation in libosmogb
|
|
*
|
|
* (C) 2020 by sysmocom - s.f.m.c. GmbH
|
|
* Author: Philipp Maier <pmaier@sysmocom.de>
|
|
*
|
|
* Skeleton based on bssgp_fc_test.c
|
|
* (C) 2012 by Harald Welte <laforge@gnumonks.org>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#undef _GNU_SOURCE
|
|
#define _GNU_SOURCE
|
|
|
|
#include <osmocom/core/application.h>
|
|
#include <osmocom/core/utils.h>
|
|
#include <osmocom/gprs/gprs_bssgp.h>
|
|
#include <osmocom/gprs/gprs_ns.h>
|
|
#include <osmocom/gprs/gprs_bssgp_rim.h>
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
|
|
void dump_rim_ri(struct bssgp_rim_routing_info *ri)
|
|
{
|
|
switch (ri->discr) {
|
|
case BSSGP_RIM_ROUTING_INFO_GERAN:
|
|
printf("GERAN cell identifier\n");
|
|
printf(" * mcc: %u\n", ri->geran.raid.mcc);
|
|
printf(" mnc: %u\n", ri->geran.raid.mnc);
|
|
printf(" mnc 3 digits: %u\n", ri->geran.raid.mnc_3_digits);
|
|
printf(" lac: %u\n", ri->geran.raid.lac);
|
|
printf(" rac: %u\n", ri->geran.raid.rac);
|
|
printf(" * cell id: %04x\n", ri->geran.cid);
|
|
break;
|
|
case BSSGP_RIM_ROUTING_INFO_UTRAN:
|
|
printf("UTRAN RNC identifier\n");
|
|
printf(" * mcc: %u\n", ri->utran.raid.mcc);
|
|
printf(" mnc: %u\n", ri->utran.raid.mnc);
|
|
printf(" mnc 3 digits: %u\n", ri->utran.raid.mnc_3_digits);
|
|
printf(" lac: %u\n", ri->utran.raid.lac);
|
|
printf(" rac: %u\n", ri->utran.raid.rac);
|
|
printf(" * rnc id: %04x\n", ri->utran.rncid);
|
|
break;
|
|
case BSSGP_RIM_ROUTING_INFO_EUTRAN:
|
|
printf("EUTRAN eNB identifier\n");
|
|
printf(" * mcc: %u\n", ri->eutran.tai.mcc);
|
|
printf(" mnc: %u\n", ri->eutran.tai.mnc);
|
|
printf(" mnc 3 digits: %u\n", ri->eutran.tai.mnc_3_digits);
|
|
printf(" tac: %u\n", ri->eutran.tai.tac);
|
|
printf(" * global_enb_id: %s\n",
|
|
osmo_hexdump_nospc(ri->eutran.global_enb_id,
|
|
ri->eutran.global_enb_id_len));
|
|
break;
|
|
default:
|
|
OSMO_ASSERT(false);
|
|
}
|
|
}
|
|
|
|
static void test_bssgp_parse_rim_ri()
|
|
{
|
|
int rc;
|
|
struct bssgp_rim_routing_info result;
|
|
uint8_t testvec_geran[] =
|
|
{ 0x00, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
|
|
uint8_t testvec_utran[] =
|
|
{ 0x01, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
|
|
uint8_t testvec_eutran[] =
|
|
{ 0x02, 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_parse_rim_ri(&result, testvec_geran,
|
|
sizeof(testvec_geran));
|
|
printf("rc=%d\n", rc);
|
|
dump_rim_ri(&result);
|
|
printf("\n");
|
|
|
|
rc = bssgp_parse_rim_ri(&result, testvec_utran,
|
|
sizeof(testvec_utran));
|
|
printf("rc=%d\n", rc);
|
|
dump_rim_ri(&result);
|
|
printf("\n");
|
|
|
|
rc = bssgp_parse_rim_ri(&result, testvec_eutran,
|
|
sizeof(testvec_eutran));
|
|
printf("rc=%d\n", rc);
|
|
dump_rim_ri(&result);
|
|
printf("\n");
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_create_rim_ri()
|
|
{
|
|
int rc;
|
|
struct bssgp_rim_routing_info ri;
|
|
uint8_t result[15];
|
|
|
|
printf("----- %s START\n", __func__);
|
|
memset(&ri, 0, sizeof(ri));
|
|
memset(result, 0, sizeof(result));
|
|
ri.discr = BSSGP_RIM_ROUTING_INFO_GERAN;
|
|
|
|
ri.geran.raid.mcc = 262;
|
|
ri.geran.raid.mnc = 42;
|
|
ri.geran.raid.mnc_3_digits = false;
|
|
ri.geran.raid.lac = 13200;
|
|
ri.geran.raid.rac = 0;
|
|
ri.geran.cid = 0x51e1;
|
|
dump_rim_ri(&ri);
|
|
rc = bssgp_create_rim_ri(result, &ri);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n\n");
|
|
|
|
memset(&ri, 0, sizeof(ri));
|
|
memset(result, 0, sizeof(result));
|
|
ri.discr = BSSGP_RIM_ROUTING_INFO_UTRAN;
|
|
ri.utran.raid.mcc = 262;
|
|
ri.utran.raid.mnc = 42;
|
|
ri.utran.raid.mnc_3_digits = 0;
|
|
ri.utran.raid.lac = 13200;
|
|
ri.utran.raid.rac = 0;
|
|
ri.utran.rncid = 0x51e1;
|
|
dump_rim_ri(&ri);
|
|
rc = bssgp_create_rim_ri(result, &ri);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n\n");
|
|
|
|
memset(&ri, 0, sizeof(ri));
|
|
memset(result, 0, sizeof(result));
|
|
ri.discr = BSSGP_RIM_ROUTING_INFO_EUTRAN;
|
|
ri.eutran.tai.mcc = 262;
|
|
ri.eutran.tai.mnc = 42;
|
|
ri.eutran.tai.mnc_3_digits = 0;
|
|
ri.eutran.tai.tac = 13200;
|
|
ri.eutran.global_enb_id[0] = 0x00;
|
|
ri.eutran.global_enb_id[1] = 0x51;
|
|
ri.eutran.global_enb_id[2] = 0xe1;
|
|
ri.eutran.global_enb_id_len = 3;
|
|
dump_rim_ri(&ri);
|
|
rc = bssgp_create_rim_ri(result, &ri);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n\n");
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
void dump_bssgp_ran_inf_req_app_cont_nacc(struct bssgp_ran_inf_req_app_cont_nacc *app_cont)
|
|
{
|
|
printf(" app_cont: bssgp_ran_inf_req_app_cont_nacc:\n");
|
|
printf(" reprt_cell.rai.lac.plmn.mcc = %u\n", app_cont->reprt_cell.rai.lac.plmn.mcc);
|
|
printf(" reprt_cell.rai.lac.plmn.mnc = %u\n", app_cont->reprt_cell.rai.lac.plmn.mnc);
|
|
printf(" reprt_cell.rai.lac.plmn.mnc_3_digits = %u\n", app_cont->reprt_cell.rai.lac.plmn.mnc_3_digits);
|
|
printf(" reprt_cell.rai.lac.lac = %u\n", app_cont->reprt_cell.rai.lac.lac);
|
|
printf(" reprt_cell.rai.rac = %u\n", app_cont->reprt_cell.rai.rac);
|
|
printf(" reprt_cell.cell_identity = %04x\n", app_cont->reprt_cell.cell_identity);
|
|
}
|
|
|
|
void dump_bssgp_ran_inf_req_rim_cont(struct bssgp_ran_inf_req_rim_cont *rim_cont)
|
|
{
|
|
printf("bssgp_ran_inf_req_rim_cont:\n");
|
|
printf(" app_id = %02x\n", rim_cont->app_id);
|
|
printf(" seq_num = %08x\n", rim_cont->seq_num);
|
|
printf(" pdu_ind.ack_requested = %u\n", rim_cont->pdu_ind.ack_requested);
|
|
printf(" pdu_ind.pdu_type_ext = %u\n", rim_cont->pdu_ind.pdu_type_ext);
|
|
printf(" prot_ver = %u\n", rim_cont->prot_ver);
|
|
switch (rim_cont->app_id) {
|
|
case BSSGP_RAN_INF_APP_ID_NACC:
|
|
dump_bssgp_ran_inf_req_app_cont_nacc(&rim_cont->u.app_cont_nacc);
|
|
break;
|
|
case BSSGP_RAN_INF_APP_ID_SI3:
|
|
case BSSGP_RAN_INF_APP_ID_MBMS:
|
|
case BSSGP_RAN_INF_APP_ID_SON:
|
|
case BSSGP_RAN_INF_APP_ID_UTRA_SI:
|
|
printf(" app_cont: (not implemented yet)\n");
|
|
break;
|
|
default:
|
|
printf(" app_cont: (illegal application identifier)\n");
|
|
}
|
|
if (rim_cont->son_trans_app_id) {
|
|
printf(" son_trans_app_id: %s\n",
|
|
osmo_hexdump_nospc(rim_cont->son_trans_app_id, rim_cont->son_trans_app_id_len));
|
|
printf(" son_trans_app_id_len: %zu\n", rim_cont->son_trans_app_id_len);
|
|
}
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_req_rim_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_req_rim_cont rim_cont_dec;
|
|
uint8_t testvec[] =
|
|
{ 0x4b, 0x81, 0x01, 0x4c, 0x84, 0x00, 0x00, 0x00, 0x01, 0x4f, 0x81, 0x02, 0x55, 0x81, 0x01, 0x4d, 0x88,
|
|
0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_req_rim_cont(&rim_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_req_rim_cont(&rim_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_req_rim_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_req_rim_cont rim_cont = { };
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rim_cont.app_id = BSSGP_RAN_INF_APP_ID_NACC;
|
|
rim_cont.seq_num = 1;
|
|
rim_cont.pdu_ind.ack_requested = 0;
|
|
rim_cont.pdu_ind.pdu_type_ext = 1;
|
|
rim_cont.prot_ver = 1;
|
|
rim_cont.son_trans_app_id = NULL;
|
|
rim_cont.son_trans_app_id_len = 0;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.plmn.mcc = 262;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.plmn.mnc = 42;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.plmn.mnc_3_digits = 0;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.lac = 13200;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.rac = 0;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.cell_identity = 0x51e1;
|
|
|
|
dump_bssgp_ran_inf_req_rim_cont(&rim_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_req_rim_cont(result, sizeof(result), &rim_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void dump_bssgp_ran_inf_app_cont_nacc(struct bssgp_ran_inf_app_cont_nacc *app_cont)
|
|
{
|
|
unsigned int i;
|
|
unsigned int silen;
|
|
printf(" app_cont: bssgp_ran_inf_app_cont_nacc:\n");
|
|
printf(" reprt_cell.rai.lac.plmn.mcc = %u\n", app_cont->reprt_cell.rai.lac.plmn.mcc);
|
|
printf(" reprt_cell.rai.lac.plmn.mnc = %u\n", app_cont->reprt_cell.rai.lac.plmn.mnc);
|
|
printf(" reprt_cell.rai.lac.plmn.mnc_3_digits = %u\n", app_cont->reprt_cell.rai.lac.plmn.mnc_3_digits);
|
|
printf(" reprt_cell.rai.lac.lac = %u\n", app_cont->reprt_cell.rai.lac.lac);
|
|
printf(" reprt_cell.rai.rac = %u\n", app_cont->reprt_cell.rai.rac);
|
|
printf(" reprt_cell.cell_identity = %04x\n", app_cont->reprt_cell.cell_identity);
|
|
printf(" type_psi = %u\n", app_cont->type_psi);
|
|
printf(" num_si = %u\n", app_cont->num_si);
|
|
|
|
if (app_cont->type_psi)
|
|
silen = 22;
|
|
else
|
|
silen = 21;
|
|
|
|
for (i = 0; i < app_cont->num_si; i++)
|
|
printf(" si[%u] = %s\n", i, osmo_hexdump_nospc(app_cont->si[i], silen));
|
|
}
|
|
|
|
static void dump_bssgp_app_err_cont_nacc(struct bssgp_app_err_cont_nacc *app_cont)
|
|
{
|
|
printf(" app_err_cont: bssgp_app_err_cont_nacc:\n");
|
|
printf(" macc_cause = %02x\n", app_cont->nacc_cause);
|
|
if (app_cont->err_app_cont) {
|
|
printf(" err_app_cont: %s\n", osmo_hexdump_nospc(app_cont->err_app_cont, app_cont->err_app_cont_len));
|
|
printf(" err_app_cont_len: %zu\n", app_cont->err_app_cont_len);
|
|
}
|
|
}
|
|
|
|
static void dump_bssgp_ran_inf_rim_cont(struct bssgp_ran_inf_rim_cont *rim_cont)
|
|
{
|
|
printf("bssgp_ran_inf_rim_cont:\n");
|
|
printf(" app_id = %02x\n", rim_cont->app_id);
|
|
printf(" seq_num = %08x\n", rim_cont->seq_num);
|
|
printf(" pdu_ind.ack_requested = %u\n", rim_cont->pdu_ind.ack_requested);
|
|
printf(" pdu_ind.pdu_type_ext = %u\n", rim_cont->pdu_ind.pdu_type_ext);
|
|
printf(" prot_ver = %u\n", rim_cont->prot_ver);
|
|
printf(" app_err = %u\n", rim_cont->app_err);
|
|
if (rim_cont->app_err) {
|
|
switch (rim_cont->app_id) {
|
|
case BSSGP_RAN_INF_APP_ID_NACC:
|
|
dump_bssgp_app_err_cont_nacc(&rim_cont->u.app_err_cont_nacc);
|
|
break;
|
|
case BSSGP_RAN_INF_APP_ID_SI3:
|
|
case BSSGP_RAN_INF_APP_ID_MBMS:
|
|
case BSSGP_RAN_INF_APP_ID_SON:
|
|
case BSSGP_RAN_INF_APP_ID_UTRA_SI:
|
|
printf(" app_err_cont: (not implemented yet)\n");
|
|
break;
|
|
default:
|
|
printf(" app_err_cont: (illegal application identifier)\n");
|
|
}
|
|
} else {
|
|
switch (rim_cont->app_id) {
|
|
case BSSGP_RAN_INF_APP_ID_NACC:
|
|
dump_bssgp_ran_inf_app_cont_nacc(&rim_cont->u.app_cont_nacc);
|
|
break;
|
|
case BSSGP_RAN_INF_APP_ID_SI3:
|
|
case BSSGP_RAN_INF_APP_ID_MBMS:
|
|
case BSSGP_RAN_INF_APP_ID_SON:
|
|
case BSSGP_RAN_INF_APP_ID_UTRA_SI:
|
|
printf(" app_cont: (not implemented yet)\n");
|
|
break;
|
|
default:
|
|
printf(" app_cont: (illegal application identifier)\n");
|
|
}
|
|
}
|
|
if (rim_cont->son_trans_app_id) {
|
|
printf(" son_trans_app_id: %s\n",
|
|
osmo_hexdump_nospc(rim_cont->son_trans_app_id, rim_cont->son_trans_app_id_len));
|
|
printf(" son_trans_app_id_len: %zu\n", rim_cont->son_trans_app_id_len);
|
|
}
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_rim_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_rim_cont rim_cont_dec;
|
|
uint8_t testvec[] =
|
|
{ 0x4b, 0x81, 0x01, 0x4c, 0x84, 0x00, 0x00, 0x00, 0x02, 0x4f, 0x81, 0x02, 0x55, 0x81, 0x01, 0x4e, 0xc8,
|
|
0x62, 0xf2, 0x24, 0x33, 0x4f, 0x00, 0x51, 0xe0, 0x06, 0x19, 0x8f, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x2b, 0x1b, 0x75, 0x30, 0x00, 0xf1, 0x10,
|
|
0x23, 0x6e,
|
|
0xc9, 0x03, 0x3c, 0x27, 0x47, 0x40, 0x79, 0x00, 0x00, 0x3c, 0x0b, 0x2b, 0x2b, 0x00, 0x90, 0x00, 0x18,
|
|
0x5a, 0x6f,
|
|
0xc9, 0xe0, 0x84, 0x10, 0xab, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b
|
|
};
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_rim_cont(&rim_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_rim_cont(&rim_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_rim_cont_err_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_rim_cont rim_cont_dec;
|
|
uint8_t testvec[] =
|
|
{ 0x4b, 0x81, 0x01, 0x4c, 0x84, 0x00, 0x00, 0x00, 0x01, 0x4f, 0x81, 0x02, 0x55, 0x81, 0x01, 0x56, 0x86,
|
|
0x01, 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_rim_cont(&rim_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_rim_cont(&rim_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_rim_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_rim_cont rim_cont = { };
|
|
|
|
uint8_t si1[] =
|
|
{ 0x19, 0x8f, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x79, 0x00, 0x00, 0x2b
|
|
};
|
|
uint8_t si3[] =
|
|
{ 0x1b, 0x75, 0x30, 0x00, 0xf1, 0x10, 0x23, 0x6e, 0xc9, 0x03, 0x3c, 0x27, 0x47, 0x40, 0x79, 0x00, 0x00,
|
|
0x3c, 0x0b, 0x2b, 0x2b
|
|
};
|
|
uint8_t si13[] =
|
|
{ 0x00, 0x90, 0x00, 0x18, 0x5a, 0x6f, 0xc9, 0xe0, 0x84, 0x10, 0xab, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
|
|
0x2b, 0x2b, 0x2b, 0x2b
|
|
};
|
|
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rim_cont.app_id = BSSGP_RAN_INF_APP_ID_NACC;
|
|
rim_cont.seq_num = 1;
|
|
rim_cont.pdu_ind.ack_requested = 0;
|
|
rim_cont.pdu_ind.pdu_type_ext = 1;
|
|
rim_cont.prot_ver = 1;
|
|
rim_cont.son_trans_app_id = NULL;
|
|
rim_cont.son_trans_app_id_len = 0;
|
|
rim_cont.app_err = false;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.plmn.mcc = 262;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.plmn.mnc = 42;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.plmn.mnc_3_digits = 0;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.lac.lac = 13135;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.rai.rac = 0;
|
|
rim_cont.u.app_cont_nacc.reprt_cell.cell_identity = 0x51e0;
|
|
rim_cont.u.app_cont_nacc.type_psi = 0;
|
|
rim_cont.u.app_cont_nacc.num_si = 3;
|
|
rim_cont.u.app_cont_nacc.si[0] = si1;
|
|
rim_cont.u.app_cont_nacc.si[1] = si3;
|
|
rim_cont.u.app_cont_nacc.si[2] = si13;
|
|
|
|
dump_bssgp_ran_inf_rim_cont(&rim_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_rim_cont(result, sizeof(result), &rim_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_rim_cont_err_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_rim_cont rim_cont = { };
|
|
uint8_t err_app_cont[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
|
|
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rim_cont.app_id = BSSGP_RAN_INF_APP_ID_NACC;
|
|
rim_cont.seq_num = 1;
|
|
rim_cont.pdu_ind.ack_requested = 0;
|
|
rim_cont.pdu_ind.pdu_type_ext = 1;
|
|
rim_cont.prot_ver = 1;
|
|
rim_cont.son_trans_app_id = NULL;
|
|
rim_cont.son_trans_app_id_len = 0;
|
|
rim_cont.app_err = true;
|
|
rim_cont.u.app_err_cont_nacc.nacc_cause = BSSGP_NACC_CAUSE_SYNTAX_ERR;
|
|
rim_cont.u.app_err_cont_nacc.err_app_cont = err_app_cont;
|
|
rim_cont.u.app_err_cont_nacc.err_app_cont_len = sizeof(err_app_cont);
|
|
dump_bssgp_ran_inf_rim_cont(&rim_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_rim_cont(result, sizeof(result), &rim_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void dump_bssgp_ran_inf_ack_rim_cont(struct bssgp_ran_inf_ack_rim_cont *rim_cont)
|
|
{
|
|
printf("bssgp_ran_inf_ack_rim_cont:\n");
|
|
printf(" app_id = %02x\n", rim_cont->app_id);
|
|
printf(" seq_num = %08x\n", rim_cont->seq_num);
|
|
printf(" prot_ver = %u\n", rim_cont->prot_ver);
|
|
if (rim_cont->son_trans_app_id) {
|
|
printf(" son_trans_app_id: %s\n",
|
|
osmo_hexdump_nospc(rim_cont->son_trans_app_id, rim_cont->son_trans_app_id_len));
|
|
printf(" son_trans_app_id_len: %zu\n", rim_cont->son_trans_app_id_len);
|
|
}
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_ack_rim_cont()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_ack_rim_cont rim_cont_dec;
|
|
uint8_t testvec[] = { 0x4b, 0x81, 0x01, 0x4c, 0x84, 0x00, 0x00, 0x00, 0x01, 0x55, 0x81, 0x01 };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_ack_rim_cont(&rim_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_ack_rim_cont(&rim_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_ack_rim_cont()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_ack_rim_cont rim_cont = { };
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rim_cont.app_id = BSSGP_RAN_INF_APP_ID_NACC;
|
|
rim_cont.seq_num = 1;
|
|
rim_cont.prot_ver = 1;
|
|
rim_cont.son_trans_app_id = NULL;
|
|
rim_cont.son_trans_app_id_len = 0;
|
|
dump_bssgp_ran_inf_ack_rim_cont(&rim_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_ack_rim_cont(result, sizeof(result), &rim_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
void dump_bssgp_ran_inf_err_rim_cont(struct bssgp_ran_inf_err_rim_cont *rim_cont)
|
|
{
|
|
printf("bssgp_ran_inf_err_rim_cont:\n");
|
|
printf(" app_id = %02x\n", rim_cont->app_id);
|
|
printf(" cause = %02x\n", rim_cont->cause);
|
|
printf(" prot_ver = %u\n", rim_cont->prot_ver);
|
|
if (rim_cont->err_pdu) {
|
|
printf(" err_pdu: %s\n", osmo_hexdump_nospc(rim_cont->err_pdu, rim_cont->err_pdu_len));
|
|
printf(" err_pdu_len: %zu\n", rim_cont->err_pdu_len);
|
|
}
|
|
if (rim_cont->son_trans_app_id) {
|
|
printf(" son_trans_app_id: %s\n",
|
|
osmo_hexdump_nospc(rim_cont->son_trans_app_id, rim_cont->son_trans_app_id_len));
|
|
printf(" son_trans_app_id_len: %zu\n", rim_cont->son_trans_app_id_len);
|
|
}
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_err_rim_cont()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_err_rim_cont rim_cont_dec;
|
|
uint8_t testvec[] =
|
|
{ 0x4b, 0x81, 0x17, 0x07, 0x81, 0x2b, 0x55, 0x81, 0x01, 0x15, 0x85, 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_err_rim_cont(&rim_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_err_rim_cont(&rim_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_err_rim_cont()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_err_rim_cont rim_cont = { };
|
|
uint8_t err_pdu[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rim_cont.app_id = 23;
|
|
rim_cont.cause = 0x2b;
|
|
rim_cont.prot_ver = 1;
|
|
rim_cont.err_pdu = err_pdu;
|
|
rim_cont.err_pdu_len = sizeof(err_pdu);
|
|
rim_cont.son_trans_app_id = NULL;
|
|
rim_cont.son_trans_app_id_len = 0;
|
|
dump_bssgp_ran_inf_err_rim_cont(&rim_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_err_rim_cont(result, sizeof(result), &rim_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
void dump_bssgp_ran_inf_app_err_rim_cont(struct bssgp_ran_inf_app_err_rim_cont *rim_cont)
|
|
{
|
|
printf("bssgp_ran_inf_app_err_rim_cont:\n");
|
|
printf(" app_id = %02x\n", rim_cont->app_id);
|
|
printf(" seq_num = %08x\n", rim_cont->seq_num);
|
|
printf(" pdu_ind.ack_requested = %u\n", rim_cont->pdu_ind.ack_requested);
|
|
printf(" pdu_ind.pdu_type_ext = %u\n", rim_cont->pdu_ind.pdu_type_ext);
|
|
printf(" prot_ver = %u\n", rim_cont->prot_ver);
|
|
switch (rim_cont->app_id) {
|
|
case BSSGP_RAN_INF_APP_ID_NACC:
|
|
dump_bssgp_app_err_cont_nacc(&rim_cont->u.app_err_cont_nacc);
|
|
break;
|
|
case BSSGP_RAN_INF_APP_ID_SI3:
|
|
case BSSGP_RAN_INF_APP_ID_MBMS:
|
|
case BSSGP_RAN_INF_APP_ID_SON:
|
|
case BSSGP_RAN_INF_APP_ID_UTRA_SI:
|
|
printf(" app_err_cont: (not implemented yet)\n");
|
|
break;
|
|
default:
|
|
printf(" app_err_cont: (illegal application identifier)\n");
|
|
}
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_app_err_rim_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_app_err_rim_cont rim_cont_dec;
|
|
uint8_t testvec[] =
|
|
{ 0x4b, 0x81, 0x01, 0x4c, 0x84, 0x00, 0x00, 0x00, 0x01, 0x4f, 0x81, 0x02, 0x55, 0x81, 0x01, 0x56, 0x85,
|
|
0xaa, 0xbb, 0xcc, 0xdd, 0xee
|
|
};
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_app_err_rim_cont(&rim_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_app_err_rim_cont(&rim_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_app_err_rim_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_app_err_rim_cont rim_cont = { };
|
|
uint8_t err_app_cont[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
|
|
uint8_t result[256];
|
|
|
|
printf("----- %s START\n", __func__);
|
|
rim_cont.app_id = BSSGP_RAN_INF_APP_ID_NACC;
|
|
rim_cont.seq_num = 1;
|
|
rim_cont.pdu_ind.ack_requested = 0;
|
|
rim_cont.pdu_ind.pdu_type_ext = 1;
|
|
rim_cont.prot_ver = 1;
|
|
rim_cont.u.app_err_cont_nacc.nacc_cause = BSSGP_NACC_CAUSE_SYNTAX_ERR;
|
|
rim_cont.u.app_err_cont_nacc.err_app_cont = err_app_cont;
|
|
rim_cont.u.app_err_cont_nacc.err_app_cont_len = sizeof(err_app_cont);
|
|
dump_bssgp_ran_inf_app_err_rim_cont(&rim_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_app_err_rim_cont(result, sizeof(result), &rim_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_req_app_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_req_app_cont_nacc app_cont_dec;
|
|
uint8_t testvec[] = { 0x62, 0xf2, 0x24, 0x33, 0x90, 0x00, 0x51, 0xe1 };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_req_app_cont_nacc(&app_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_req_app_cont_nacc(&app_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_req_app_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_req_app_cont_nacc app_cont = { };
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
app_cont.reprt_cell.rai.lac.plmn.mcc = 262;
|
|
app_cont.reprt_cell.rai.lac.plmn.mnc = 42;
|
|
app_cont.reprt_cell.rai.lac.plmn.mnc_3_digits = 0;
|
|
app_cont.reprt_cell.rai.lac.lac = 13200;
|
|
app_cont.reprt_cell.rai.rac = 0;
|
|
app_cont.reprt_cell.cell_identity = 0x51e1;
|
|
dump_bssgp_ran_inf_req_app_cont_nacc(&app_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_req_app_cont_nacc(result, sizeof(result), &app_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_dec_ran_inf_app_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_app_cont_nacc app_cont_dec;
|
|
uint8_t testvec[] =
|
|
{ 0x62, 0xf2, 0x24, 0x33, 0x4f, 0x00, 0x51, 0xe0, 0x06, 0x19, 0x8f, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x2b, 0x1b, 0x75, 0x30, 0x00, 0xf1, 0x10,
|
|
0x23, 0x6e, 0xc9, 0x03, 0x3c, 0x27, 0x47, 0x40, 0x79, 0x00, 0x00, 0x3c, 0x0b, 0x2b, 0x2b, 0x00, 0x90, 0x00, 0x18,
|
|
0x5a, 0x6f, 0xc9, 0xe0, 0x84, 0x10, 0xab, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_ran_inf_app_cont_nacc(&app_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_ran_inf_app_cont_nacc(&app_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_ran_inf_app_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_ran_inf_app_cont_nacc app_cont = { };
|
|
|
|
uint8_t si1[] =
|
|
{ 0x19, 0x8f, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x79, 0x00, 0x00, 0x2b };
|
|
uint8_t si3[] =
|
|
{ 0x1b, 0x75, 0x30, 0x00, 0xf1, 0x10, 0x23, 0x6e, 0xc9, 0x03, 0x3c, 0x27, 0x47, 0x40, 0x79, 0x00, 0x00,
|
|
0x3c, 0x0b, 0x2b, 0x2b };
|
|
uint8_t si13[] =
|
|
{ 0x00, 0x90, 0x00, 0x18, 0x5a, 0x6f, 0xc9, 0xe0, 0x84, 0x10, 0xab, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
|
|
0x2b, 0x2b, 0x2b, 0x2b };
|
|
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
app_cont.reprt_cell.rai.lac.plmn.mcc = 262;
|
|
app_cont.reprt_cell.rai.lac.plmn.mnc = 42;
|
|
app_cont.reprt_cell.rai.lac.plmn.mnc_3_digits = 0;
|
|
app_cont.reprt_cell.rai.lac.lac = 13135;
|
|
app_cont.reprt_cell.rai.rac = 0;
|
|
app_cont.reprt_cell.cell_identity = 0x51e1;
|
|
app_cont.type_psi = false;
|
|
app_cont.num_si = 3;
|
|
app_cont.si[0] = si1;
|
|
app_cont.si[1] = si3;
|
|
app_cont.si[2] = si13;
|
|
dump_bssgp_ran_inf_app_cont_nacc(&app_cont);
|
|
|
|
rc = bssgp_enc_ran_inf_app_cont_nacc(result, sizeof(result), &app_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_dec_app_err_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_app_err_cont_nacc app_cont_dec;
|
|
uint8_t testvec[] = { 0x01, 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
|
|
|
|
printf("----- %s START\n", __func__);
|
|
|
|
rc = bssgp_dec_app_err_cont_nacc(&app_cont_dec, testvec, sizeof(testvec));
|
|
printf("rc=%d, ", rc);
|
|
if (rc == 0)
|
|
dump_bssgp_app_err_cont_nacc(&app_cont_dec);
|
|
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
static void test_bssgp_enc_app_err_cont_nacc()
|
|
{
|
|
int rc;
|
|
struct bssgp_app_err_cont_nacc app_cont = { };
|
|
uint8_t err_app_cont[] = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee };
|
|
uint8_t result[256];
|
|
printf("----- %s START\n", __func__);
|
|
|
|
app_cont.nacc_cause = BSSGP_NACC_CAUSE_SYNTAX_ERR;
|
|
app_cont.err_app_cont = err_app_cont;
|
|
app_cont.err_app_cont_len = sizeof(err_app_cont);
|
|
dump_bssgp_app_err_cont_nacc(&app_cont);
|
|
|
|
rc = bssgp_enc_app_err_cont_nacc(result, sizeof(result), &app_cont);
|
|
printf("rc=%d, ", rc);
|
|
if (rc > 0)
|
|
printf("result=%s", osmo_hexdump_nospc(result, rc));
|
|
printf("\n");
|
|
printf("----- %s END\n", __func__);
|
|
}
|
|
|
|
int bssgp_prim_cb(struct osmo_prim_hdr *oph, void *ctx)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
printf("===== BSSGP RIM test START\n");
|
|
|
|
/* RIM routing information */
|
|
test_bssgp_parse_rim_ri();
|
|
test_bssgp_create_rim_ri();
|
|
|
|
/* RIM containers */
|
|
test_bssgp_dec_ran_inf_req_rim_cont_nacc();
|
|
test_bssgp_enc_ran_inf_req_rim_cont_nacc();
|
|
test_bssgp_dec_ran_inf_rim_cont_nacc();
|
|
test_bssgp_dec_ran_inf_rim_cont_err_nacc();
|
|
test_bssgp_enc_ran_inf_rim_cont_nacc();
|
|
test_bssgp_enc_ran_inf_rim_cont_err_nacc();
|
|
test_bssgp_dec_ran_inf_ack_rim_cont();
|
|
test_bssgp_enc_ran_inf_ack_rim_cont();
|
|
test_bssgp_dec_ran_inf_err_rim_cont();
|
|
test_bssgp_enc_ran_inf_err_rim_cont();
|
|
test_bssgp_dec_ran_inf_app_err_rim_cont_nacc();
|
|
test_bssgp_enc_ran_inf_app_err_rim_cont_nacc();
|
|
|
|
/* Application containers */
|
|
test_bssgp_dec_ran_inf_req_app_cont_nacc();
|
|
test_bssgp_enc_ran_inf_req_app_cont_nacc();
|
|
test_bssgp_dec_ran_inf_app_cont_nacc();
|
|
test_bssgp_enc_ran_inf_app_cont_nacc();
|
|
test_bssgp_dec_app_err_cont_nacc();
|
|
test_bssgp_enc_app_err_cont_nacc();
|
|
|
|
printf("===== BSSGP RIM test END\n\n");
|
|
|
|
exit(EXIT_SUCCESS);
|
|
}
|