Harald Welte has submitted this change and it was merged. ( 
https://gerrit.osmocom.org/10403 )

Change subject: HLR: Add HLR_EUSE.ttcn to implement minimal external USSD Entity
......................................................................

HLR: Add HLR_EUSE.ttcn to implement minimal external USSD Entity

As OsmoHLR is getting support for external USSD Entities (EUSEs),
we have to implement this function in the test logic in order to
test it.

Change-Id: Ibab210b06abfd5a21e81c7f7fbe574c4f67414a0
---
A hlr/HLR_EUSE.ttcn
M library/GSUP_Types.ttcn
2 files changed, 135 insertions(+), 0 deletions(-)

Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved



diff --git a/hlr/HLR_EUSE.ttcn b/hlr/HLR_EUSE.ttcn
new file mode 100644
index 0000000..1e7574b
--- /dev/null
+++ b/hlr/HLR_EUSE.ttcn
@@ -0,0 +1,124 @@
+/* Simple / General implementation of an External USSD Entity using OsmoHLR's 
GSUP Protocol
+ *
+ * The idea is that a test case can simply start an instance of this component 
in parallel to its
+ * normal test components.   HLR_EUSE_CT will then connect via GSUP to the HLR 
as the specified EUSE
+ * name.  Any USSD related GSUP message received will be passed to a 
user-provided call-back
+ * function, which will return whatever PDU to send in response back to the 
HLR.
+ */
+
+/* (C) 2018 by Harald Welte <lafo...@gnumonks.org> */
+
+module HLR_EUSE {
+
+import from GSUP_Types all;
+import from IPA_Emulation all;
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from SS_Types all;
+import from SS_Templates all;
+
+/* emulating an external USSD Entity towards OsmoHLR */
+type component HLR_EUSE_CT {
+       /* Component reference + config of underlying IPA emulation */
+       var IPA_Emulation_CT vc_IPA_EUSE;
+       var IPA_CCM_Parameters ccm_pars;
+       /* port towards the underlying IPA emulation */
+       port IPA_GSUP_PT EUSE;
+}
+
+private function f_init(charstring hlr_ip, uint16_t hlr_gsup_port, charstring 
name) runs on HLR_EUSE_CT {
+       var charstring id := "EUSE-" & name;
+       ccm_pars := c_IPA_default_ccm_pars;
+       ccm_pars.name := "Osmocom TTCN-3 EUSE Simulator";
+       ccm_pars.ser_nr := id;
+
+       vc_IPA_EUSE := IPA_Emulation_CT.create("IPA-" & id);
+       map(vc_IPA_EUSE:IPA_PORT, system:IPA_CODEC_PT);
+       connect(vc_IPA_EUSE:IPA_GSUP_PORT, self:EUSE);
+       vc_IPA_EUSE.start(IPA_Emulation.main_client(hlr_ip, hlr_gsup_port, "", 
0, ccm_pars));
+
+       timer T := 10.0;
+       T.start;
+       alt {
+       [] EUSE.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { repeat; }
+       [] EUSE.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) { }
+       [] T.timeout {
+               setverdict(fail, "EUSE: Timeout waiting for GSUP IPA Link to 
come up");
+               self.stop;
+               }
+       }
+}
+
+type function f_euse_cb(GSUP_SessionState ss_state, GSUP_PDU rx_pdu) return 
GSUP_PDU;
+
+function f_ss_echo_continue(GSUP_SessionState ss_state, GSUP_PDU rx_pdu) 
return GSUP_PDU {
+       var GSUP_SessionState ss_next_state;
+       var GSUP_IeValue ss_ie;
+       var SS_FacilityInformation dec_fac, rsp_fac;
+       var octetstring ss_rsp;
+
+       f_gsup_find_ie(rx_pdu, OSMO_GSUP_SS_INFO_IE, ss_ie);
+       dec_fac := dec_SS_FacilityInformation(ss_ie.ss_info);
+       log("dec_fac: ", dec_fac);
+       rsp_fac := 
valueof(ts_SS_USSD_FACILITY_RETURN_RESULT(dec_fac[0].invoke.invokeId.present_,
+                                       SS_OP_CODE_PROCESS_USS_REQ,
+                                       
dec_fac[0].invoke.argument.uSSD_Arg.ussd_DataCodingScheme,
+                                       
dec_fac[0].invoke.argument.uSSD_Arg.ussd_String));
+       ss_rsp := enc_SS_FacilityInformation(rsp_fac);
+       select (ss_state) {
+       case (OSMO_GSUP_SESSION_STATE_BEGIN) { ss_next_state := 
OSMO_GSUP_SESSION_STATE_CONTINUE; }
+       case (OSMO_GSUP_SESSION_STATE_CONTINUE) { ss_next_state := 
OSMO_GSUP_SESSION_STATE_END; }
+       }
+       return valueof(ts_GSUP_PROC_SS_RES(rx_pdu.ies[0].val.imsi, 
rx_pdu.ies[1].val.session_id,
+                                          ss_next_state, ss_rsp));
+}
+
+function f_ss_echo(GSUP_SessionState ss_state, GSUP_PDU rx_pdu) return 
GSUP_PDU {
+       var GSUP_IeValue ss_ie;
+       var SS_FacilityInformation dec_fac, rsp_fac;
+       var octetstring ss_rsp;
+
+       f_gsup_find_ie(rx_pdu, OSMO_GSUP_SS_INFO_IE, ss_ie);
+       dec_fac := dec_SS_FacilityInformation(ss_ie.ss_info);
+       log("dec_fac: ", dec_fac);
+       rsp_fac := 
valueof(ts_SS_USSD_FACILITY_RETURN_RESULT(dec_fac[0].invoke.invokeId.present_,
+                                       SS_OP_CODE_PROCESS_USS_REQ,
+                                       
dec_fac[0].invoke.argument.uSSD_Arg.ussd_DataCodingScheme,
+                                       
dec_fac[0].invoke.argument.uSSD_Arg.ussd_String));
+       ss_rsp := enc_SS_FacilityInformation(rsp_fac);
+       return valueof(ts_GSUP_PROC_SS_RES(rx_pdu.ies[0].val.imsi, 
rx_pdu.ies[1].val.session_id,
+                                          OSMO_GSUP_SESSION_STATE_END, 
ss_rsp));
+}
+
+/* main function for handling mobile-originated USSD via GSUP */
+function f_main_mo(charstring hlr_ip, uint16_t hlr_gsup_port, charstring name, 
f_euse_cb cb_fn)
+runs on HLR_EUSE_CT {
+       var GSUP_PDU rx_pdu, tx_pdu;
+
+       f_init(hlr_ip, hlr_gsup_port, name);
+
+       while (true) {
+               alt {
+               [] EUSE.receive(tr_GSUP_PROC_SS_REQ(?, ?, 
OSMO_GSUP_SESSION_STATE_BEGIN)) -> value rx_pdu {
+                       EUSE.send(cb_fn.apply(OSMO_GSUP_SESSION_STATE_BEGIN, 
rx_pdu));
+                       }
+               [] EUSE.receive(tr_GSUP_PROC_SS_REQ(?, ?, 
OSMO_GSUP_SESSION_STATE_CONTINUE)) -> value rx_pdu {
+                       EUSE.send(cb_fn.apply(OSMO_GSUP_SESSION_STATE_CONTINUE, 
rx_pdu));
+                       }
+
+               [] EUSE.receive(tr_GSUP_PROC_SS_REQ(?, ?, 
OSMO_GSUP_SESSION_STATE_END)) -> value rx_pdu {
+                       EUSE.send(cb_fn.apply(OSMO_GSUP_SESSION_STATE_END, 
rx_pdu));
+                       }
+
+
+               [] EUSE.receive {
+                       setverdict(fail, "EUSE: Unexpected Rx from HLR");
+                       self.stop;
+                       }
+               }
+       }
+}
+
+
+}
diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn
index 6044565..ba8180f 100644
--- a/library/GSUP_Types.ttcn
+++ b/library/GSUP_Types.ttcn
@@ -687,4 +687,15 @@
        }
 );

+function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) 
return boolean {
+       for (var integer i := 0; i < sizeof(msg.ies); i := i+1) {
+               if (msg.ies[i].tag == iei) {
+                       ret := msg.ies[i].val;
+                       return true;
+               }
+       }
+               return false;
+}
+
+
 } with { encode "RAW"; variant "FIELDORDER(msb)" }

--
To view, visit https://gerrit.osmocom.org/10403
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-MessageType: merged
Gerrit-Change-Id: Ibab210b06abfd5a21e81c7f7fbe574c4f67414a0
Gerrit-Change-Number: 10403
Gerrit-PatchSet: 2
Gerrit-Owner: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Harald Welte <lafo...@gnumonks.org>
Gerrit-Reviewer: Jenkins Builder

Reply via email to