aboutsummaryrefslogtreecommitdiffstats
path: root/ggsn_tests
diff options
context:
space:
mode:
Diffstat (limited to 'ggsn_tests')
-rw-r--r--ggsn_tests/GGSN_Tests.default9
-rw-r--r--ggsn_tests/GGSN_Tests.ttcn76
-rwxr-xr-xggsn_tests/gen_links.sh5
-rwxr-xr-xggsn_tests/regen_makefile.sh2
4 files changed, 86 insertions, 6 deletions
diff --git a/ggsn_tests/GGSN_Tests.default b/ggsn_tests/GGSN_Tests.default
index 2d57f897..ff0cd975 100644
--- a/ggsn_tests/GGSN_Tests.default
+++ b/ggsn_tests/GGSN_Tests.default
@@ -1,6 +1,14 @@
[LOGGING]
[TESTPORT_PARAMETERS]
+*.GGSNVTY.CTRL_MODE := "client"
+*.GGSNVTY.CTRL_HOSTNAME := "127.0.0.1"
+*.GGSNVTY.CTRL_PORTNUM := "4260"
+*.GGSNVTY.CTRL_LOGIN_SKIPPED := "yes"
+*.GGSNVTY.CTRL_DETECT_SERVER_DISCONNECTED := "yes"
+*.GGSNVTY.CTRL_READMODE := "buffered"
+*.GGSNVTY.CTRL_CLIENT_CLEANUP_LINEFEED := "yes"
+*.GGSNVTY.PROMPT1 := "OsmoGGSN> "
[MODULE_PARAMETERS]
GGSN_Tests.m_bind_ip_gtpc := "127.0.42.1"
@@ -11,5 +19,6 @@ GGSN_Tests.m_ggsn_ip4_dns1 := "192.168.100.1"
GGSN_Tests.m_ggsn_ip4_dns2 := "8.8.8.8"
GGSN_Tests.m_ggsn_ip6_dns1 := "2001:4860:4860::8888"
GGSN_Tests.m_ggsn_ip6_dns2 := "2001:4860:4860::8844"
+Osmocom_VTY_Functions.mp_prompt_prefix := "OsmoGGSN";
[EXECUTE]
diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index 14690628..ba8fae5d 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -14,6 +14,8 @@ module GGSN_Tests {
import from ICMP_Types all;
import from ICMPv6_Types all;
import from Native_Functions all;
+ import from Osmocom_VTY_Functions all;
+ import from TELNETasp_PortType all;
const integer GTP0_PORT := 3386;
const integer GTP1C_PORT := 2123;
@@ -89,6 +91,42 @@ module GGSN_Tests {
var uint16_t g_c_seq_nr;
/* next to-be-sent GTP-U sequence number */
var uint16_t g_d_seq_nr;
+
+ port TELNETasp_PT GGSNVTY;
+ var boolean use_gptu_txseq := true;
+ }
+
+ private function f_init_vty() runs on GT_CT {
+ map(self:GGSNVTY, system:GGSNVTY);
+ f_vty_set_prompts(GGSNVTY);
+ f_vty_transceive(GGSNVTY, "enable");
+ }
+
+ private function f_vty_set_gpdu_txseq(boolean enable) runs on GT_CT {
+ f_vty_enter_config(GGSNVTY);
+ f_vty_transceive(GGSNVTY, "ggsn ggsn0");
+ f_vty_transceive(GGSNVTY, "apn internet");
+ if (enable) {
+ f_vty_transceive(GGSNVTY, "g-pdu tx-sequence-numbers");
+ } else {
+ f_vty_transceive(GGSNVTY, "no g-pdu tx-sequence-numbers");
+ }
+ f_vty_transceive(GGSNVTY, "end");
+ }
+
+ private function f_verify_gtpu_txseq(in PDU_GTPU gtpu, in boolean expect_gptu_txseq) return boolean {
+ if (expect_gptu_txseq) {
+ if (gtpu.s_bit != '1'B) {
+ log("GTPU sequence number expected but not present")
+ return false;
+ }
+ } else {
+ if (gtpu.s_bit != '0'B) {
+ log("GTPU sequence number not expected but present")
+ return false;
+ }
+ }
+ return true;
}
function f_init() runs on GT_CT {
@@ -113,6 +151,9 @@ module GGSN_Tests {
g_restart_ctr := f_rnd_octstring(1);
g_c_seq_nr := f_rnd_int(65535);
g_d_seq_nr := f_rnd_int(65535);
+
+ f_init_vty();
+ f_vty_set_gpdu_txseq(use_gptu_txseq);
}
/* Altstep implementing responses to any incoming echo requests */
@@ -167,8 +208,12 @@ module GGSN_Tests {
/* send GTP-U for a given context and increment sequence number */
function f_send_gtpu(inout PdpContext ctx, in octetstring data) runs on GT_CT {
- GTPU.send(ts_GTP1U_GPDU(g_peer_u, g_d_seq_nr, ctx.teid_remote, data));
- g_d_seq_nr := g_d_seq_nr + 1;
+ if (use_gptu_txseq) {
+ GTPU.send(ts_GTP1U_GPDU(g_peer_u, g_d_seq_nr, ctx.teid_remote, data));
+ g_d_seq_nr := g_d_seq_nr + 1;
+ } else {
+ GTPU.send(ts_GTP1U_GPDU(g_peer_u, omit, ctx.teid_remote, data));
+ }
}
/* send a PDP context activation */
@@ -558,6 +603,10 @@ module GGSN_Tests {
T_default.start;
alt {
[] GTPU.receive(tr_GTPU_GPDU(g_peer_u, ?)) -> value ud {
+ if (f_verify_gtpu_txseq(ud.gtpu, use_gptu_txseq) == false) {
+ setverdict(fail);
+ stop;
+ }
var octetstring gpdu := ud.gtpu.gtpu_IEs.g_PDU_IEs.data;
var IPv4_packet ip4 := f_IPv4_dec(gpdu);
if (ip4.header.ver != 4) {
@@ -590,6 +639,10 @@ module GGSN_Tests {
T_default.start;
alt {
[] GTPU.receive(tr_GTPU_GPDU(g_peer_u, ?)) -> value ud {
+ if (f_verify_gtpu_txseq(ud.gtpu, use_gptu_txseq) == false) {
+ setverdict(fail);
+ stop;
+ }
var octetstring gpdu := ud.gtpu.gtpu_IEs.g_PDU_IEs.data;
var IPv6_packet ip6 := f_IPv6_dec(gpdu);
if (ip6.header.ver != 6 or ip6.header.nexthead != 58) {
@@ -840,8 +893,8 @@ module GGSN_Tests {
f_pdp_ctx_del(ctx, '1'B);
}
- /* Validate if different clients (pdp ctx) can reach one another through GGSN. */
- testcase TC_pdp4_clients_interact() runs on GT_CT {
+ /* Helper function for tests below. */
+ function f_pdp4_clients_interact() runs on GT_CT {
f_init();
var PdpContext ctxA := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));
var PdpContext ctxB := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));
@@ -855,6 +908,18 @@ module GGSN_Tests {
f_pdp_ctx_del(ctxA, '1'B);
}
+ /* Validate if different clients (pdp ctx) can reach one another through GGSN. */
+ testcase TC_pdp4_clients_interact_with_txseq() runs on GT_CT {
+ use_gptu_txseq := true;
+ f_pdp4_clients_interact();
+ }
+
+ /* Validate if different clients (pdp ctx) can reach one another through GGSN (without Tx sequence number). */
+ testcase TC_pdp4_clients_interact_without_txseq() runs on GT_CT {
+ use_gptu_txseq := false;
+ f_pdp4_clients_interact();
+ }
+
testcase TC_echo_req_resp() runs on GT_CT {
f_init();
f_send_gtpc(ts_GTPC_PING(g_peer_c, g_c_seq_nr));
@@ -872,7 +937,8 @@ module GGSN_Tests {
execute(TC_pdp4_act_deact_ipcp());
execute(TC_pdp4_act_deact_pcodns());
execute(TC_pdp4_act_deact_gtpu_access());
- execute(TC_pdp4_clients_interact());
+ execute(TC_pdp4_clients_interact_with_txseq());
+ execute(TC_pdp4_clients_interact_without_txseq());
execute(TC_pdp6_act_deact());
execute(TC_pdp6_act_deact_pcodns());
diff --git a/ggsn_tests/gen_links.sh b/ggsn_tests/gen_links.sh
index 6ef52e17..4e012ae3 100755
--- a/ggsn_tests/gen_links.sh
+++ b/ggsn_tests/gen_links.sh
@@ -40,9 +40,14 @@ DIR=$BASEDIR/titan.ProtocolModules.GTP_v13.5.0/src
FILES="GTPC_EncDec.cc GTPC_Types.ttcn GTPU_EncDec.cc GTPU_Types.ttcn"
gen_links $DIR $FILES
+DIR=$BASEDIR/titan.TestPorts.TELNETasp/src
+FILES="TELNETasp_PT.cc TELNETasp_PT.hh TELNETasp_PortType.ttcn"
+gen_links $DIR $FILES
+
DIR=../library
FILES="General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPCP_Types.ttcn "
FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Templates.ttcn "
+FILES+="Osmocom_VTY_Functions.ttcn "
gen_links $DIR $FILES
ignore_pp_results
diff --git a/ggsn_tests/regen_makefile.sh b/ggsn_tests/regen_makefile.sh
index 2fc74f70..6db1a3dd 100755
--- a/ggsn_tests/regen_makefile.sh
+++ b/ggsn_tests/regen_makefile.sh
@@ -1,5 +1,5 @@
#!/bin/sh
-FILES="*.ttcn IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc GTPC_EncDec.cc GTPU_EncDec.cc GTP_CodecPort_CtrlFunctDef.cc ICMPv6_EncDec.cc IP_EncDec.cc Native_FunctionDefs.cc UDP_EncDec.cc ICMP_EncDec.cc"
+FILES="*.ttcn IPL4asp_PT.cc IPL4asp_discovery.cc TCCConversion.cc TCCInterface.cc GTPC_EncDec.cc GTPU_EncDec.cc GTP_CodecPort_CtrlFunctDef.cc ICMPv6_EncDec.cc IP_EncDec.cc Native_FunctionDefs.cc UDP_EncDec.cc ICMP_EncDec.cc TELNETasp_PT.cc"
../regen-makefile.sh GGSN_Tests.ttcn $FILES