aboutsummaryrefslogtreecommitdiffstats
path: root/src/tests
diff options
context:
space:
mode:
authorNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-04-19 00:13:53 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-04-19 01:32:25 +0200
commit4470f93074d2281b87ebbf53e0205b1b390bf21a (patch)
tree79a996d939eaa5aab1e46f788dc754bd63cae12b /src/tests
parent26779f8573262fe80a2079e2e9a5956ec0c79f17 (diff)
hnb-test: simplify crossing message layers
Adding the Security Mode Control command would break the current scheme of callbacks across layers. This brought to my attention that the scheme is indeed unnecessarily complex, so simplify it. Instead of passing callbacks, call functions directly. Add hnb-test-layers.h to declare those functions that cross from main to rua, to ranap and back to main and remove the callback type definitions. Instead of copying the NAS PDU to a newly allocated msgb, pass the data and len directly to hnb_test_nas_rx_dtap(). Instead of repeatedly checking the gsm48_hdr length, just pass the struct gsm48_hdr* and len around and assume the basic header length has been checked. In some places, rename 'length' to 'len' for cosmetic consistency.
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/hnb-test-layers.h15
-rw-r--r--src/tests/hnb-test-ranap.c47
-rw-r--r--src/tests/hnb-test-rua.c22
-rw-r--r--src/tests/hnb-test.c105
4 files changed, 68 insertions, 121 deletions
diff --git a/src/tests/hnb-test-layers.h b/src/tests/hnb-test-layers.h
new file mode 100644
index 0000000..4b17461
--- /dev/null
+++ b/src/tests/hnb-test-layers.h
@@ -0,0 +1,15 @@
+#pragma once
+
+struct ANY;
+struct ranap_message_s;
+struct hnb_test;
+
+/* main calls RUA */
+void hnb_test_rua_dt_handle(struct hnb_test *hnb, struct ANY *in);
+
+/* RUA calls RANAP */
+void hnb_test_rua_dt_handle_ranap(struct hnb_test *hnb,
+ struct ranap_message_s *ranap_msg);
+
+/* RANAP calls main with actual payload*/
+void hnb_test_nas_rx_dtap(struct hnb_test *hnb, void *data, int len);
diff --git a/src/tests/hnb-test-ranap.c b/src/tests/hnb-test-ranap.c
index 7412d83..63e3d92 100644
--- a/src/tests/hnb-test-ranap.c
+++ b/src/tests/hnb-test-ranap.c
@@ -1,6 +1,8 @@
#include <osmocom/core/msgb.h>
#include <osmocom/ranap/ranap_ies_defs.h>
+#include "hnb-test-layers.h"
+
static const char *printstr(OCTET_STRING_t *s)
{
return osmo_hexdump((char*)s->buf, s->size);
@@ -10,38 +12,25 @@ static const char *printstr(OCTET_STRING_t *s)
printf(#octet_string_t " = %s\n",\
printstr(&octet_string_t))
-void ranap_msg_dt_print(void *ctx, ranap_message *ranap_msg)
+void hnb_test_rua_dt_handle_ranap(struct hnb_test *hnb,
+ struct ranap_message_s *ranap_msg)
{
- OSMO_ASSERT(ranap_msg->procedureCode ==
- RANAP_ProcedureCode_id_DirectTransfer);
-
- printf("rx DirectTransfer: presence = %hx\n", ranap_msg->msg.directTransferIEs.presenceMask);
- PP(ranap_msg->msg.directTransferIEs.nas_pdu);
-
-/*
-typedef struct RANAP_DirectTransferIEs_s {
- uint16_t presenceMask;
- RANAP_NAS_PDU_t nas_pdu;
- RANAP_LAI_t lai; ///< Optional field
- RANAP_RAC_t rac; ///< Optional field
- RANAP_SAI_t sai; ///< Optional field
- RANAP_SAPI_t sapi; ///< Optional field
-} RANAP_DirectTransferIEs_t;
-*/
-}
+ int len;
+ char *data;
-void ranap_msg_dt_get(void *ctx, ranap_message *ranap_msg)
-{
- struct msgb *m = ctx;
- OSMO_ASSERT(ranap_msg->procedureCode ==
- RANAP_ProcedureCode_id_DirectTransfer);
+ printf("rx ranap_msg->procedureCode %d\n",
+ ranap_msg->procedureCode);
- printf("rx DirectTransfer: presence = %hx\n", ranap_msg->msg.directTransferIEs.presenceMask);
- PP(ranap_msg->msg.directTransferIEs.nas_pdu);
+ switch (ranap_msg->procedureCode) {
+ case RANAP_ProcedureCode_id_DirectTransfer:
+ printf("rx DirectTransfer: presence = %hx\n",
+ ranap_msg->msg.directTransferIEs.presenceMask);
+ PP(ranap_msg->msg.directTransferIEs.nas_pdu);
- int len = ranap_msg->msg.directTransferIEs.nas_pdu.size;
- char *data = ranap_msg->msg.directTransferIEs.nas_pdu.buf;
+ len = ranap_msg->msg.directTransferIEs.nas_pdu.size;
+ data = ranap_msg->msg.directTransferIEs.nas_pdu.buf;
- m->l3h = m->data;
- memcpy(msgb_put(m, len), data, len);
+ hnb_test_nas_rx_dtap(hnb, data, len);
+ return;
+ }
}
diff --git a/src/tests/hnb-test-rua.c b/src/tests/hnb-test-rua.c
index 41df4f2..e3f44c5 100644
--- a/src/tests/hnb-test-rua.c
+++ b/src/tests/hnb-test-rua.c
@@ -2,36 +2,22 @@
#include <asn1c/ANY.h>
#include "../rua_ies_defs.h"
-struct ranap_message_s;
+#include "hnb-test-layers.h"
-typedef void (*ranap_handle_cb)(void *ctx, struct ranap_message_s *ranap_msg);
-
-extern void ranap_msg_dt_print(void *ctx, struct ranap_message_s *ranap_msg);
-extern void ranap_msg_dt_get(void *ctx, struct ranap_message_s *ranap_msg);
-
-static void direct_transfer_nas_pdu_handle(ANY_t *in, ranap_handle_cb handler, void *ctx)
+void hnb_test_rua_dt_handle(struct hnb_test *hnb, ANY_t *in)
{
RUA_DirectTransferIEs_t ies;
int rc;
rc = rua_decode_directtransferies(&ies, in);
if (rc < 0) {
- printf("print_rua_init_dt(): failed to decode rua IEs\n");
+ printf("failed to decode RUA DT IEs\n");
return;
}
- rc = ranap_cn_rx_co(handler, ctx, ies.ranaP_Message.buf, ies.ranaP_Message.size);
+ rc = ranap_cn_rx_co(hnb_test_rua_dt_handle_ranap, hnb, ies.ranaP_Message.buf, ies.ranaP_Message.size);
/* FIXME: what to do with the asn1c-allocated memory */
rua_free_directtransferies(&ies);
}
-void direct_transfer_nas_pdu_print(ANY_t *in)
-{
- direct_transfer_nas_pdu_handle(in, ranap_msg_dt_print, NULL);
-}
-
-void direct_transfer_nas_pdu_get(ANY_t *in, struct msgb *m)
-{
- direct_transfer_nas_pdu_handle(in, ranap_msg_dt_get, m);
-}
diff --git a/src/tests/hnb-test.c b/src/tests/hnb-test.c
index 4940fa8..0f5b231 100644
--- a/src/tests/hnb-test.c
+++ b/src/tests/hnb-test.c
@@ -51,6 +51,7 @@
#include <osmocom/crypt/auth.h>
#include "hnb-test.h"
+#include "hnb-test-layers.h"
#include "hnbap_common.h"
#include "hnbap_ies_defs.h"
#include "rua_msg_factory.h"
@@ -240,28 +241,16 @@ static int hnb_test_nas_tx_dt(struct hnb_test *hnb, struct msgb *txm)
return 0;
}
-static struct tlv_parsed *parse_mm(struct msgb *rxm)
+static struct tlv_parsed *parse_mm(struct gsm48_hdr *gh, int len)
{
static struct tlv_parsed tp;
- struct gsm48_hdr *gh;
int parse_res;
- int length = msgb_l3len(rxm);
- if (length < sizeof(*gh)) {
- printf("GSM48 header does not fit.\n");
- return NULL;
- }
-
- gh = (struct gsm48_hdr *) msgb_l3(rxm);
- if (!gh) {
- printf("received msg buffer with invalid layer 3. Ignoring.\n");
- return -1;
- }
- length -= (const char *)&gh->data[0] - (const char *)gh;
+ len -= (const char *)&gh->data[0] - (const char *)gh;
OSMO_ASSERT(gsm48_hdr_pdisc(gh) == GSM48_PDISC_MM);
- parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], length, 0, 0);
+ parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], len, 0, 0);
if (parse_res <= 0) {
uint8_t msg_type = gsm48_hdr_msg_type(gh);
printf("Error parsing MM message 0x%hhx: %d\n", msg_type, parse_res);
@@ -271,23 +260,11 @@ static struct tlv_parsed *parse_mm(struct msgb *rxm)
return &tp;
}
-int hnb_test_nas_rx_lu_accept(struct msgb *rxm, int *sent_tmsi)
+int hnb_test_nas_rx_lu_accept(struct gsm48_hdr *gh, int len, int *sent_tmsi)
{
printf(" :D Location Update Accept :D\n");
- struct gsm48_hdr *gh;
struct gsm48_loc_area_id *lai;
- int length = msgb_l3len(rxm);
-
- if (length < sizeof(*gh)) {
- printf("GSM48 header does not fit.\n");
- return -1;
- }
- gh = (struct gsm48_hdr *)msgb_l3(rxm);
- if (!gh) {
- printf("received msg buffer with invalid layer 3. Ignoring.\n");
- return -1;
- }
lai = (struct gsm48_loc_area_id *)&gh->data[0];
uint16_t mcc, mnc, lac;
@@ -298,8 +275,8 @@ int hnb_test_nas_rx_lu_accept(struct msgb *rxm, int *sent_tmsi)
struct tlv_parsed tp;
int parse_res;
- length -= (const char *)&gh->data[0] - (const char *)gh;
- parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], length, 0, 0);
+ len -= (const char *)&gh->data[0] - (const char *)gh;
+ parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], len, 0, 0);
if (parse_res <= 0) {
printf("Error parsing Location Update Accept message: %d\n", parse_res);
return -1;
@@ -314,10 +291,10 @@ int hnb_test_nas_rx_lu_accept(struct msgb *rxm, int *sent_tmsi)
return 0;
}
-void hnb_test_nas_rx_mm_info(struct msgb *rxm)
+void hnb_test_nas_rx_mm_info(struct gsm48_hdr *gh, int len)
{
printf(" :) MM Info :)\n");
- struct tlv_parsed *tp = parse_mm(rxm);
+ struct tlv_parsed *tp = parse_mm(gh, len);
if (!tp)
return;
@@ -338,26 +315,15 @@ void hnb_test_nas_rx_mm_info(struct msgb *rxm)
}
}
-static int hnb_test_nas_rx_auth_req(struct hnb_test *hnb, struct msgb *rxm)
+static int hnb_test_nas_rx_auth_req(struct hnb_test *hnb, struct gsm48_hdr *gh,
+ int len)
{
- struct gsm48_hdr *gh;
struct gsm48_auth_req *ar;
int parse_res;
- int length = msgb_l3len(rxm);
- if (length < sizeof(*gh)) {
- printf("GSM48 header does not fit.\n");
- return;
- }
-
- gh = (struct gsm48_hdr *) msgb_l3(rxm);
- if (!gh) {
- printf("received msg buffer with invalid layer 3. Ignoring.\n");
- return -1;
- }
- length -= (const char *)&gh->data[0] - (const char *)gh;
+ len -= (const char *)&gh->data[0] - (const char *)gh;
- if (length < sizeof(*ar)) {
+ if (len < sizeof(*ar)) {
printf("GSM48 Auth Req does not fit.\n");
return;
}
@@ -391,7 +357,7 @@ static int hnb_test_nas_rx_auth_req(struct hnb_test *hnb, struct msgb *rxm)
return hnb_test_nas_tx_dt(hnb, gen_nas_auth_resp(vec.sres));
}
-static int hnb_test_nas_rx_mm(struct hnb_test *hnb, struct msgb *rxm)
+static int hnb_test_nas_rx_mm(struct hnb_test *hnb, struct gsm48_hdr *gh, int len)
{
struct hnbtest_chan *chan;
@@ -403,11 +369,6 @@ static int hnb_test_nas_rx_mm(struct hnb_test *hnb, struct msgb *rxm)
OSMO_ASSERT(!chan->is_ps);
- struct gsm48_hdr *gh = msgb_l3(rxm);
- if (!gh) {
- printf("received msg buffer with invalid layer 3. Ignoring.\n");
- return -1;
- }
uint8_t msg_type = gsm48_hdr_msg_type(gh);
int sent_tmsi;
@@ -416,7 +377,7 @@ static int hnb_test_nas_rx_mm(struct hnb_test *hnb, struct msgb *rxm)
return hnb_test_nas_tx_dt(hnb, gen_nas_id_resp());
case GSM48_MT_MM_LOC_UPD_ACCEPT:
- if (hnb_test_nas_rx_lu_accept(rxm, &sent_tmsi))
+ if (hnb_test_nas_rx_lu_accept(gh, len, &sent_tmsi))
return -1;
if (sent_tmsi)
return hnb_test_nas_tx_dt(hnb, gen_nas_tmsi_realloc_compl());
@@ -428,11 +389,11 @@ static int hnb_test_nas_rx_mm(struct hnb_test *hnb, struct msgb *rxm)
return 0;
case GSM48_MT_MM_INFO:
- hnb_test_nas_rx_mm_info(rxm);
+ hnb_test_nas_rx_mm_info(gh, len);
return 0;
case GSM48_MT_MM_AUTH_REQ:
- return hnb_test_nas_rx_auth_req(hnb, rxm);
+ return hnb_test_nas_rx_auth_req(hnb, gh, len);
default:
printf("04.08 message type not handled by hnb-test: 0x%x\n",
@@ -442,30 +403,33 @@ static int hnb_test_nas_rx_mm(struct hnb_test *hnb, struct msgb *rxm)
}
-static int hnb_test_nas_rx_dtap(struct hnb_test *hnb, struct msgb *msg)
+void hnb_test_nas_rx_dtap(struct hnb_test *hnb, void *data, int len)
{
- printf("got %d bytes: %s\n", msg->len, osmo_hexdump(msg->data, msg->len));
+ int rc;
+ printf("got %d bytes: %s\n", len, osmo_hexdump(data, len));
// nas_pdu == '05 08 12' ==> IMEI Identity request
// '05 04 0d' ==> LU reject
- struct gsm48_hdr *gh = msgb_l3(msg);
- if (!gh) {
- printf("received msg buffer with invalid layer 3. Ignoring.\n");
- return -1;
+ struct gsm48_hdr *gh = data;
+ if (len < sizeof(*gh)) {
+ printf("hnb_test_nas_rx_dtap(): NAS PDU is too short: %d. Ignoring.\n",
+ len);
+ return;
}
uint8_t pdisc = gsm48_hdr_pdisc(gh);
switch (pdisc) {
case GSM48_PDISC_MM:
- return hnb_test_nas_rx_mm(hnb, msg);
+ rc = hnb_test_nas_rx_mm(hnb, gh, len);
+ if (rc != 0)
+ printf("Error receiving MM message: %d\n", rc);
+ return;
default:
printf("04.08 discriminator not handled by hnb-test: %d\n",
pdisc);
- return 0;
+ return;
}
-
-
}
int hnb_test_hnbap_rx(struct hnb_test *hnb, struct msgb *msg)
@@ -544,14 +508,7 @@ int hnb_test_rua_rx(struct hnb_test *hnb, struct msgb *msg)
break;
case RUA_ProcedureCode_id_DirectTransfer:
printf("RUA rx DirectTransfer\n");
- {
- struct msgb *m = msgb_alloc(1500, "direct_transfer_nas_pdu");
- direct_transfer_nas_pdu_get(&pdu->choice.successfulOutcome.value, m);
-
- hnb_test_nas_rx_dtap(hnb, m);
-
- msgb_free(m);
- }
+ hnb_test_rua_dt_handle(hnb, &pdu->choice.successfulOutcome.value);
break;
case RUA_ProcedureCode_id_Disconnect:
printf("RUA rx Disconnect\n");