pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/27061 )
Change subject: ggsn: Set up diameter for open5gs ......................................................................
ggsn: Set up diameter for open5gs
Change-Id: Iedadb98be2a2e851b75e4e67c22bca7047191fec --- M ggsn_tests/GGSN_Tests.ttcn M ggsn_tests/gen_links.sh M ggsn_tests/regen_makefile.sh 3 files changed, 77 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/61/27061/1
diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn index 63e0696..b11e0af 100644 --- a/ggsn_tests/GGSN_Tests.ttcn +++ b/ggsn_tests/GGSN_Tests.ttcn @@ -31,9 +31,14 @@ import from Osmocom_VTY_Functions all; import from TELNETasp_PortType all;
+ import from DIAMETER_Types all; + import from DIAMETER_Templates all; + import from DIAMETER_Emulation all; + const integer GTP0_PORT := 3386; const integer GTP1C_PORT := 2123; const integer GTP1U_PORT := 2152; + const integer PCRF_PORT := 3868;
type enumerated GGSN_Impl { GGSN_IMPL_OSMOCOM, @@ -118,6 +123,11 @@ port TELNETasp_PT GGSNVTY; var boolean use_gtpu_txseq := false; var boolean g_use_echo := false; + + /* emulated PCRF, used with m_ggsn_impl = GGSN_IMPL_OPEN5GS */ + var DIAMETER_Emulation_CT vc_DIAMETER; + port DIAMETER_PT DIAMETER_UNIT; + port DIAMETEREM_PROC_PT DIAMETER_PROC; }
private function f_init_vty() runs on GT_CT { @@ -181,6 +191,36 @@ f_vty_transceive(GGSNVTY, "end"); }
+ friend function DiameterForwardUnitdataCallback(PDU_DIAMETER msg) + runs on DIAMETER_Emulation_CT return template PDU_DIAMETER { + DIAMETER_UNIT.send(msg); + return omit; + } + + friend function f_init_diameter(charstring id) runs on GT_CT { + var DIAMETEROps ops := { + create_cb := refers(DIAMETER_Emulation.ExpectedCreateCallback), + unitdata_cb := refers(DiameterForwardUnitdataCallback), + raw := true /* handler mode (single component for all IMSI)) */ + }; + var DIAMETER_conn_parameters pars := { + remote_ip := m_ggsn_ip_gtpc, + remote_sctp_port := -1, + local_ip := m_bind_ip_gtpc, + local_sctp_port := PCRF_PORT, + origin_host := "ttcn3ggsntest.localdomain", + origin_realm := "localdomain", + vendor_app_id := c_DIAMETER_3GPP_Gx_AID + }; + vc_DIAMETER := DIAMETER_Emulation_CT.create(id); + map(vc_DIAMETER:DIAMETER, system:DIAMETER_CODEC_PT); + connect(vc_DIAMETER:DIAMETER_UNIT, self:DIAMETER_UNIT); + connect(vc_DIAMETER:DIAMETER_PROC, self:DIAMETER_PROC); + vc_DIAMETER.start(DIAMETER_Emulation.main(ops, pars, id)); + + f_diameter_wait_capability(DIAMETER_UNIT); + } + function f_init() runs on GT_CT { if (g_initialized == true) { return; @@ -208,6 +248,8 @@ f_init_vty(); f_vty_set_gpdu_txseq(use_gtpu_txseq); f_vty_enable_echo_interval(g_use_echo); + } else if (m_ggsn_impl == GGSN_IMPL_OPEN5GS) { + f_init_diameter(testcasename()); } }
@@ -328,6 +370,28 @@ } }
+ private altstep as_DIA_CCR(DCC_NONE_CC_Request_Type req_type) runs on GT_CT { + var PDU_DIAMETER rx_dia; + [] DIAMETER_UNIT.receive(tr_DIA_CCR(req_type := req_type)) -> value rx_dia { + var template (omit) AVP avp; + var octetstring sess_id; + var AVP_Unsigned32 req_num; + + avp := f_DIAMETER_get_avp(rx_dia, c_AVP_Code_BASE_NONE_Session_Id); + sess_id := valueof(avp.avp_data.avp_BASE_NONE_Session_Id); + + avp := f_DIAMETER_get_avp(rx_dia, c_AVP_Code_DCC_NONE_CC_Request_Number); + req_num := valueof(avp.avp_data.avp_DCC_NONE_CC_Request_Number); + + DIAMETER_UNIT.send(ts_DIA_CCA(rx_dia.hop_by_hop_id, rx_dia.end_to_end_id, sess_id, + req_type, req_num)); + } + [] DIAMETER_UNIT.receive(PDU_DIAMETER:?) -> value rx_dia { + setverdict(fail, "Received unexpected DIAMETER ", rx_dia); + self.stop; + } + } + /* send a PDP context activation */ function f_pdp_ctx_act(inout PdpContext ctx, OCT1 exp_cause := '80'O) runs on GT_CT { var Gtp1cUnitdata ud; @@ -339,6 +403,9 @@ g_sgsn_ip_c, g_sgsn_ip_u, ctx.msisdn, ctx.pco_req, ctx.ratType, ctx.uli)); T_default.start; d := activate(pingpong()); + if (DIAMETER_PROC.checkstate("Connected")) { + as_DIA_CCR(INITIAL_REQUEST); + } alt { [] GTPC.receive(tr_GTPC_MsgType(g_peer_c, createPDPContextResponse, ctx.teic)) -> value ud { f_handle_create_req(ctx, ud, exp_cause); @@ -393,6 +460,9 @@ f_send_gtpc(ts_GTPC_DeletePDP(g_peer_c, g_c_seq_nr, ctx.teic_remote, ctx.nsapi, teardown_ind)); T_default.start; d := activate(pingpong()); + if (DIAMETER_PROC.checkstate("Connected")) { + as_DIA_CCR(TERMINATION_REQUEST); + } alt { [] GTPC.receive(tr_GTPC_MsgType(g_peer_c, deletePDPContextResponse, expect_teid)) -> value ud { if (ud.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue == expect_causevalue) { diff --git a/ggsn_tests/gen_links.sh b/ggsn_tests/gen_links.sh index f9bae1c..6626467 100755 --- a/ggsn_tests/gen_links.sh +++ b/ggsn_tests/gen_links.sh @@ -52,9 +52,14 @@ FILES="BSSGP_EncDec.cc BSSGP_Types.ttcn" gen_links $DIR $FILES
+DIR=$BASEDIR/titan.ProtocolModules.DIAMETER_ProtocolModule_Generator/src +FILES="DIAMETER_EncDec.cc" +gen_links $DIR $FILES + DIR=../library FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPCP_Types.ttcn PAP_Types.ttcn " FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Templates.ttcn Osmocom_Gb_Types.ttcn " +FILES+="DIAMETER_Types.ttcn DIAMETER_CodecPort.ttcn DIAMETER_CodecPort_CtrlFunct.ttcn DIAMETER_CodecPort_CtrlFunctDef.cc DIAMETER_Emulation.ttcn DIAMETER_Templates.ttcn " FILES+="Osmocom_VTY_Functions.ttcn " gen_links $DIR $FILES
diff --git a/ggsn_tests/regen_makefile.sh b/ggsn_tests/regen_makefile.sh index 7adbd0b..4bdc87a 100755 --- a/ggsn_tests/regen_makefile.sh +++ b/ggsn_tests/regen_makefile.sh @@ -5,6 +5,8 @@ FILES=" *.ttcn BSSGP_EncDec.cc + DIAMETER_CodecPort_CtrlFunctDef.cc + DIAMETER_EncDec.cc GTPC_EncDec.cc GTPU_EncDec.cc GTP_CodecPort_CtrlFunctDef.cc