SGsAP_Emulation: Add functions to send MME or VLR reset
... including encoding/decoding of names between string and binary labels Change-Id: I981c7c1d34f0db60031b5436739cd924e5a09407
This commit is contained in:
parent
1fd461a936
commit
9a5dd54350
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue