diff --git a/include/osmocom/gsm/gsm29205.h b/include/osmocom/gsm/gsm29205.h index 0c3c153e1..f93e34a3f 100644 --- a/include/osmocom/gsm/gsm29205.h +++ b/include/osmocom/gsm/gsm29205.h @@ -39,3 +39,4 @@ struct osmo_gcr_parsed { uint8_t osmo_enc_gcr(struct msgb *msg, const struct osmo_gcr_parsed *g); int osmo_dec_gcr(struct osmo_gcr_parsed *gcr, const uint8_t *elem, uint8_t len); +bool osmo_gcr_eq(const struct osmo_gcr_parsed *gcr1, const struct osmo_gcr_parsed *gcr2); diff --git a/src/gsm/gsm29205.c b/src/gsm/gsm29205.c index 0ef29b72f..0d3446880 100644 --- a/src/gsm/gsm29205.c +++ b/src/gsm/gsm29205.c @@ -91,3 +91,24 @@ int osmo_dec_gcr(struct osmo_gcr_parsed *gcr, const uint8_t *elem, uint8_t len) return parsed + 5; } + +/*! Compare two GCR structs. + * \param[in] gcr1 pointer to the GCR struct + * \param[in] gcr2 pointer to the GCR struct + * \returns true if GCRs are equal, false otherwise */ +bool osmo_gcr_eq(const struct osmo_gcr_parsed *gcr1, const struct osmo_gcr_parsed *gcr2) +{ + if (gcr1->net_len != gcr2->net_len) + return false; + + if (gcr1->node != gcr2->node) + return false; + + if (memcmp(gcr1->cr, gcr2->cr, 5) != 0) + return false; + + if (memcmp(gcr1->net, gcr2->net, gcr2->net_len) != 0) + return false; + + return true; +} diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map index 60ce5d130..f9e9b8bf7 100644 --- a/src/gsm/libosmogsm.map +++ b/src/gsm/libosmogsm.map @@ -240,6 +240,7 @@ gsm29118_create_service_abort_req; osmo_enc_gcr; osmo_dec_gcr; +osmo_gcr_eq; gsm0858_rsl_ul_meas_enc; diff --git a/tests/gsm0808/gsm0808_test.c b/tests/gsm0808/gsm0808_test.c index b3cab5027..546a487b2 100644 --- a/tests/gsm0808/gsm0808_test.c +++ b/tests/gsm0808/gsm0808_test.c @@ -732,25 +732,10 @@ static void test_enc_dec_lcls() abort(); } - if (lcls_out.gcr->net_len != g.net_len) { - printf("Network ID length parsed wrong: %u != %u\n", lcls_out.gcr->net_len, g.net_len); - abort(); - } - - if (lcls_out.gcr->node != g.node) { - printf("Node ID parsed wrong: 0x%X != 0x%X\n", lcls_out.gcr->node, g.node); - abort(); - } - - if (memcmp(lcls_out.gcr->net, g.net, g.net_len) != 0) { - printf("Network ID parsed wrong: %s\n", osmo_hexdump(lcls_out.gcr->net, lcls_out.gcr->net_len)); - abort(); - } - - if (memcmp(lcls_out.gcr->cr, g.cr, 5) != 0) { - printf("Call ref. ID parsed wrong: %s\n", osmo_hexdump(lcls_out.gcr->cr, 5)); - abort(); - } + if (!osmo_gcr_eq(lcls_out.gcr, lcls_in.gcr)) { + printf("GCR parsed wrong.\n"); + abort(); + } printf("\tdecoded %d bytes: %s\n", rc, rc == len ? "OK" : "FAIL"); msgb_free(msg);