From 9a5dd54350c649fc98c0d54891c33af131368b14 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sun, 28 Oct 2018 10:33:23 +0100 Subject: [PATCH] SGsAP_Emulation: Add functions to send MME or VLR reset ... including encoding/decoding of names between string and binary labels Change-Id: I981c7c1d34f0db60031b5436739cd924e5a09407 --- library/DNS_Helpers.ttcn | 63 ++++++++++++++++++++++++++++++++++++ library/SGsAP_Emulation.ttcn | 44 ++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 1 deletion(-) create mode 100644 library/DNS_Helpers.ttcn diff --git a/library/DNS_Helpers.ttcn b/library/DNS_Helpers.ttcn new file mode 100644 index 000000000..45c3a09ce --- /dev/null +++ b/library/DNS_Helpers.ttcn @@ -0,0 +1,63 @@ +module DNS_Helpers { + +private function f_strchr(charstring s, char c) return integer { + var integer i; + for (i := 0; i < lengthof(s); i := i+1) { + if (s[i] == c) { + return i; + } + } + return -1; +} + +private function f_dns_enc_label(charstring str) return octetstring { + var octetstring ret; + + ret[0] := int2oct(lengthof(str), 1); + return ret & char2oct(str); +} + +function f_enc_dns_hostname(charstring str) return octetstring { + var octetstring ret := ''O; + while (lengthof(str) > 0) { + var integer dot_idx; + var octetstring lbl; + + dot_idx := f_strchr(str, "."); + if (dot_idx >= 0) { + /* there is another dot */ + lbl := f_dns_enc_label(substr(str, 0, dot_idx)); + str := substr(str, dot_idx+1, lengthof(str)-dot_idx-1); + } else { + /* no more dot */ + lbl := f_dns_enc_label(str); + str := ""; + } + ret := ret & lbl; + } + return ret; +} + + + + +function f_dec_dns_hostname(octetstring inp) return charstring { + var charstring ret := ""; + while (lengthof(inp) > 0) { + var integer label_len; + var charstring lbl; + + label_len := oct2int(substr(inp, 0, 1)); + lbl := oct2char(substr(inp, 1, label_len)); + inp := substr(inp, 1+label_len, lengthof(inp)-1-label_len); + + ret := ret & lbl; + if (lengthof(inp) > 0) { + ret := ret & "."; + } + } + return ret; +} + + +} diff --git a/library/SGsAP_Emulation.ttcn b/library/SGsAP_Emulation.ttcn index 0c37840b1..968bcdd3b 100644 --- a/library/SGsAP_Emulation.ttcn +++ b/library/SGsAP_Emulation.ttcn @@ -31,6 +31,7 @@ import from SGsAP_Types all; import from SGsAP_Templates all; import from Osmocom_Types all; import from IPL4asp_Types all; +import from DNS_Helpers all; type component SGsAP_ConnHdlr { port SGsAP_Conn_PT SGsAP; @@ -295,6 +296,7 @@ function main(SGsAPOps ops, SGsAP_conn_parameters p, charstring id) runs on SGsA var hexstring imsi; var SGsAP_RecvFrom mrf; var PDU_SGsAP msg; + var charstring vlr_name, mme_name; alt { /* SGsAP from client */ @@ -329,6 +331,24 @@ function main(SGsAPOps ops, SGsAP_conn_parameters p, charstring id) runs on SGsA f_create_expect(imsi, vc_conn); SGsAP_PROC.reply(SGsAPEM_register:{imsi, vc_conn}) to vc_conn; } + [] SGsAP_PROC.getcall(SGsAPEM_reset_mme:{?,-}) -> param(mme_name) { + var octetstring mme_enc, vlr_enc; + mme_enc := f_enc_dns_hostname(mme_name); + msg := f_sgsap_xceive(ts_SGsAP_RESET_IND_MME(mme_enc)); + vlr_enc := msg.sGsAP_RESET_ACK.vLR_Name.name; + vlr_name := f_dec_dns_hostname(vlr_enc); + SGsAP_PROC.reply(SGsAPEM_reset_mme:{mme_name, vlr_name}); + } + [] SGsAP_PROC.getcall(SGsAPEM_reset_vlr:{?,-}) -> param(vlr_name) { + var octetstring mme_enc, vlr_enc; + vlr_enc := f_enc_dns_hostname(vlr_name); + msg := f_sgsap_xceive(ts_SGsAP_RESET_IND_VLR(vlr_enc)); + mme_enc := msg.sGsAP_RESET_ACK.mME_Name.name; + mme_name := f_dec_dns_hostname(mme_enc); + SGsAP_PROC.reply(SGsAPEM_reset_vlr:{vlr_name, mme_name}); + } + + } } @@ -343,8 +363,11 @@ type record ExpectData { signature SGsAPEM_register(in hexstring imsi, in SGsAP_ConnHdlr hdlr); +signature SGsAPEM_reset_vlr(in charstring vlr_name, out charstring mme_name); +signature SGsAPEM_reset_mme(in charstring mme_name, out charstring vlr_name); + type port SGsAPEM_PROC_PT procedure { - inout SGsAPEM_register; + inout SGsAPEM_register, SGsAPEM_reset_vlr, SGsAPEM_reset_mme; } with { extension "internal" }; /* Function that can be used as create_cb and will usse the expect table */ @@ -399,6 +422,25 @@ function f_create_sgsap_expect(hexstring imsi) runs on SGsAP_ConnHdlr { } } +/* client/conn_hdlr side function to use procedure port to send RESET from emulated MME */ +function f_sgsap_reset_mme(charstring mme_name) runs on SGsAP_ConnHdlr return charstring { + var charstring vlr_name; + SGsAP_PROC.call(SGsAPEM_reset_mme:{mme_name, -}) { + [] SGsAP_PROC.getreply(SGsAPEM_reset_mme:{mme_name,?}) -> param(vlr_name) { + return vlr_name; + }; + } +} + +/* client/conn_hdlr side function to use procedure port to send RESET from emulated VLR */ +function f_sgsap_reset_vlr(charstring vlr_name) runs on SGsAP_ConnHdlr return charstring { + var charstring mme_name; + SGsAP_PROC.call(SGsAPEM_reset_vlr:{vlr_name, -}) { + [] SGsAP_PROC.getreply(SGsAPEM_reset_vlr:{vlr_name,?}) -> param(mme_name) { + return mme_name; + }; + } +} private function f_expect_table_init() runs on SGsAP_Emulation_CT {