hnb-test: add messages leading to Location Update Accept
But note, authentication is not there yet; the CSCN should initiate that.
diff --git a/src/tests/hnb-test.c b/src/tests/hnb-test.c
index 40a3663..6a1a667 100644
--- a/src/tests/hnb-test.c
+++ b/src/tests/hnb-test.c
@@ -41,6 +41,8 @@
#include <osmocom/core/msgb.h>
#include <osmocom/core/write_queue.h>
#include <osmocom/netif/stream.h>
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/gsm/gsm48.h>
#include <osmocom/vty/telnet_interface.h>
#include <osmocom/vty/logging.h>
@@ -196,25 +198,88 @@
return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));
}
-static int hnb_test_nas_tx_id_resp(struct hnb_test *hnb)
+static struct msgb *gen_nas_tmsi_realloc_compl()
+{
+ uint8_t id_resp[] = {
+ GSM48_PDISC_MM,
+ GSM48_MT_MM_TMSI_REALL_COMPL,
+ };
+
+ return ranap_new_msg_dt(0, id_resp, sizeof(id_resp));
+}
+
+static int hnb_test_nas_tx_dt(struct hnb_test *hnb, struct msgb *txm)
{
struct hnbtest_chan *chan;
- struct msgb *txm, *rua;
+ struct msgb *rua;
chan = hnb->cs.chan;
if (!chan) {
- printf("hnb_test_nas_tx_id_resp(): No CS channel established yet.\n");
+ printf("hnb_test_nas_tx_tmsi_realloc_compl(): No CS channel established yet.\n");
return -1;
}
- txm = gen_nas_id_resp();
rua = rua_new_dt(chan->is_ps, chan->conn_id, txm);
-
osmo_wqueue_enqueue(&g_hnb_test.wqueue, rua);
-
return 0;
}
+void hnb_test_nas_rx_lu_accept(struct msgb *rxm)
+{
+ printf(" :D Location Update Accept :D\n");
+ struct gsm48_hdr *gh;
+ struct gsm48_loc_area_id *lai;
+ gh = (struct gsm48_hdr *)msgb_l3(rxm);
+ lai = (struct gsm48_loc_area_id *)&gh->data[0];
+
+ uint16_t mcc, mnc, lac;
+ gsm48_decode_lai(lai, &mcc, &mnc, &lac);
+ printf("LU: mcc %hd mnc %hd lac %hd\n",
+ mcc, mnc, lac);
+
+}
+
+void hnb_test_nas_rx_mm_info(struct msgb *rxm)
+{
+ printf(" :) MM Info :)\n");
+ struct gsm48_hdr *gh;
+ struct tlv_parsed tp;
+ 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);
+ length -= (const char *)&gh->data[0] - (const char *)gh;
+
+ parse_res = tlv_parse(&tp, &gsm48_mm_att_tlvdef, &gh->data[0], length, 0, 0);
+ if (parse_res <= 0) {
+ printf("Error parsing MM Info message: %d\n", parse_res);
+ return;
+ }
+
+ if (TLVP_PRESENT(&tp, GSM48_IE_NAME_SHORT)) {
+ char name[128] = {0};
+ gsm_7bit_decode_n(name, 127,
+ TLVP_VAL(&tp, GSM48_IE_NAME_SHORT)+1,
+ (TLVP_LEN(&tp, GSM48_IE_NAME_SHORT)-1)*8/7);
+ printf("Info: Short Network Name: %s\n", name);
+ }
+
+ if (TLVP_PRESENT(&tp, GSM48_IE_NAME_LONG)) {
+ char name[128] = {0};
+ gsm_7bit_decode_n(name, 127,
+ TLVP_VAL(&tp, GSM48_IE_NAME_LONG)+1,
+ (TLVP_LEN(&tp, GSM48_IE_NAME_LONG)-1)*8/7);
+ printf("Info: Long Network Name: %s\n", name);
+ }
+
+ return;
+}
+
static int hnb_test_nas_rx_mm(struct hnb_test *hnb, struct msgb *rxm)
{
struct hnbtest_chan *chan;
@@ -232,10 +297,18 @@
switch (msg_type) {
case GSM48_MT_MM_ID_REQ:
+ return hnb_test_nas_tx_dt(hnb, gen_nas_id_resp());
- return hnb_test_nas_tx_id_resp(hnb);
+ case GSM48_MT_MM_LOC_UPD_ACCEPT:
+ hnb_test_nas_rx_lu_accept(rxm);
+ return hnb_test_nas_tx_dt(hnb, gen_nas_tmsi_realloc_compl());
+
+ case GSM48_MT_MM_INFO:
+ hnb_test_nas_rx_mm_info(rxm);
+ return 0;
+
default:
- printf("04.08 message type not handled by hnb-test: %d\n",
+ printf("04.08 message type not handled by hnb-test: 0x%x\n",
msg_type);
return 0;
}