pespin has submitted this change. (
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38469?usp=email )
Change subject: ggsn: Introduce test TC_pdp4(6)_act_deact_mtu
......................................................................
ggsn: Introduce test TC_pdp4(6)_act_deact_mtu
This tests so far only test retrieval of MTU over PCO, which is only
used for IPv4 APNs.
When IPv6 is in used, it is expected to be retrieved over IPv6 SLAAC RA.
Such tests will be done in a follow-up patch once the related procedure
is implemented in osmo-ggsn.
Related: OS#6298
Related: SYS#7122
Change-Id: I2ceb76a3a07b44f69937c9f5a040482320bca377
---
M ggsn_tests/GGSN_Tests.ttcn
M ggsn_tests/expected-results.xml
M ggsn_tests/gen_links.sh
M library/GTPv1C_Templates.ttcn
M library/PCO_Types.ttcn
5 files changed, 155 insertions(+), 6 deletions(-)
Approvals:
osmith: Looks good to me, but someone else must approve
Jenkins Builder: Verified
fixeria: Looks good to me, approved
diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index 8d091f9..5983703 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -26,6 +26,7 @@
import from GTPU_Types all;
import from GTPv1C_Templates all;
import from GTPv1U_Templates all;
+ import from PCO_Types all;
import from IPCP_Types all;
import from IPCP_Templates all;
import from PAP_Types all;
@@ -96,6 +97,12 @@
integer mp_t3_response := 5; /* local T3-RESPONSE timeout, seconds */
integer mp_n3_requests := 3; /* local N3-REQUESTS counter */
+ /* MTU to configure and expect when testing related tests.
+ * This needs to match the value in configured file for open5gs
+ * since there's no support to configure it dynamically over VTY.
+ */
+ uint16_t m_configured_mtu := 1400;
+
GGSN_Impl m_ggsn_impl := GGSN_IMPL_OSMOCOM;
GGSN_Conf m_ggsn_conf := GGSN_CONF_ALL;
}
@@ -226,6 +233,31 @@
f_vty_transceive(GGSNVTY, "end");
}
+ /* -1 = osmo-ggsn default mtu */
+ private function f_vty_set_mtu(integer mtu) runs on GT_CT {
+ var charstring mtu_cmd;
+ if (mtu >= 0) {
+ mtu_cmd := "mtu " & int2str(mtu);
+ } else {
+ mtu_cmd := "mtu default";
+ }
+
+ f_vty_enter_config(GGSNVTY);
+ f_vty_transceive(GGSNVTY, "ggsn ggsn0");
+
+ f_vty_transceive(GGSNVTY, "apn internet");
+ f_vty_transceive(GGSNVTY, mtu_cmd);
+ f_vty_transceive(GGSNVTY, "exit");
+
+ f_vty_transceive(GGSNVTY, "apn inet6");
+ f_vty_transceive(GGSNVTY, mtu_cmd);
+ f_vty_transceive(GGSNVTY, "exit");
+
+ f_vty_transceive(GGSNVTY, "apn inet46");
+ f_vty_transceive(GGSNVTY, mtu_cmd);
+ f_vty_transceive(GGSNVTY, "end");
+ }
+
private function DiameterForwardUnitdataCallback(PDU_DIAMETER msg)
runs on DIAMETER_Emulation_CT return template PDU_DIAMETER {
DIAMETER_UNIT.send(msg);
@@ -1331,6 +1363,36 @@
f_shutdown_helper();
}
+ /* Test PDP context activation requesting MTU in PCO */
+ testcase TC_pdp4_act_deact_mtu() runs on GT_CT {
+ f_init();
+ if (m_ggsn_impl == GGSN_IMPL_OSMOCOM) {
+ f_vty_set_mtu(m_configured_mtu);
+ } else {
+ /* In GGSN_IMPL_OPEN5GS we expect open5gs-smfd to be
+ * configured with mtu value m_configured_mtu */
+ }
+
+ var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H),
"1234", c_ApnInternet, valueof(t_EuaIPv4Dyn)));
+ ctx.pco_req := valueof(ts_PCO_MTU);
+ f_pdp_ctx_act(ctx);
+
+ f_PCO_ensure_no_duplicates(ctx.pco_neg);
+ /* verify PCO contains MTU */
+ var octetstring rx_mtu_octstr := f_PCO_extract_proto(ctx.pco_neg,
PCO_P_to_OCT2(PCO_P_IPv4_LINK_MTU), 1);
+ if (not match(rx_mtu_octstr, decmatch tr_PCO_P_UV_U16(m_configured_mtu))) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("Rx Unexpected MTU ", rx_mtu_octstr,
+ " vs exp ", tr_PCO_P_UV_U16(m_configured_mtu)));
+ }
+
+ f_pdp_ctx_del(ctx, '1'B);
+ if (m_ggsn_impl == GGSN_IMPL_OSMOCOM) {
+ f_vty_set_mtu(-1);
+ }
+ f_shutdown_helper();
+ }
+
/* Test PDP context activation for dynamic IPv4 EUA.
Test we can send ICMPv4 ping over GTPU to DNS server. */
testcase TC_pdp4_act_deact_gtpu_access() runs on GT_CT {
@@ -1667,6 +1729,36 @@
f_shutdown_helper();
}
+ /* Test IPv4v6 context activation requesting MTU in PCO */
+ testcase TC_pdp46_act_deact_mtu() runs on GT_CT {
+ f_init();
+ if (m_ggsn_impl == GGSN_IMPL_OSMOCOM) {
+ f_vty_set_mtu(m_configured_mtu);
+ } else {
+ /* In GGSN_IMPL_OPEN5GS we expect open5gs-smfd to be
+ * configured with mtu value m_configured_mtu */
+ }
+
+ var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H),
"1234", c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));
+ ctx.pco_req := valueof(ts_PCO_MTU);
+ f_pdp_ctx_act(ctx);
+
+ f_PCO_ensure_no_duplicates(ctx.pco_neg);
+ /* verify PCO contains MTU */
+ var octetstring rx_mtu_octstr := f_PCO_extract_proto(ctx.pco_neg,
PCO_P_to_OCT2(PCO_P_IPv4_LINK_MTU), 1);
+ if (not match(rx_mtu_octstr, decmatch tr_PCO_P_UV_U16(m_configured_mtu))) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("Rx Unexpected MTU ", rx_mtu_octstr,
+ " vs exp ", tr_PCO_P_UV_U16(m_configured_mtu)));
+ }
+
+ f_pdp_ctx_del(ctx, '1'B);
+ if (m_ggsn_impl == GGSN_IMPL_OSMOCOM) {
+ f_vty_set_mtu(-1);
+ }
+ f_shutdown_helper();
+ }
+
/* Test PDP context activation for dynamic IPv4v6 EUA.
Test we can send ICMPv6 ping over GTPU to DNS server. */
testcase TC_pdp46_act_deact_gtpu_access() runs on GT_CT {
@@ -2279,6 +2371,7 @@
execute(TC_pdp4_act_deact_ipcp());
execute(TC_pdp4_act_deact_ipcp_pap_broken());
execute(TC_pdp4_act_deact_pcodns());
+ execute(TC_pdp4_act_deact_mtu());
execute(TC_pdp4_act_deact_gtpu_access());
execute(TC_pdp4_act_deact_gtpu_access_wrong_saddr());
execute(TC_pdp4_act_deact_gtpu_access_ipv6_apn4());
@@ -2308,6 +2401,7 @@
execute(TC_pdp46_act_deact_icmp6());
execute(TC_pdp46_act_deact_pcodns4());
execute(TC_pdp46_act_deact_pcodns6());
+ execute(TC_pdp46_act_deact_mtu());
execute(TC_pdp46_act_deact_gtpu_access());
execute(TC_pdp46_act_deact_gtpu_access_wrong_saddr_ipv4());
execute(TC_pdp46_act_deact_gtpu_access_wrong_ll_saddr_ipv6());
diff --git a/ggsn_tests/expected-results.xml b/ggsn_tests/expected-results.xml
index baa5b1f..4e37ecd 100644
--- a/ggsn_tests/expected-results.xml
+++ b/ggsn_tests/expected-results.xml
@@ -4,6 +4,7 @@
<testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_ipcp'
time='MASKED'/>
<testcase classname='GGSN_Tests'
name='TC_pdp4_act_deact_ipcp_pap_broken' time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_pcodns'
time='MASKED'/>
+ <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_mtu'
time='MASKED'/>
<testcase classname='GGSN_Tests'
name='TC_pdp4_act_deact_gtpu_access' time='MASKED'/>
<testcase classname='GGSN_Tests'
name='TC_pdp4_clients_interact_with_txseq' time='MASKED'/>
<testcase classname='GGSN_Tests'
name='TC_pdp4_clients_interact_without_txseq' time='MASKED'/>
@@ -19,6 +20,7 @@
<testcase classname='GGSN_Tests' name='TC_pdp46_act_deact_icmp6'
time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp46_act_deact_pcodns4'
time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp46_act_deact_pcodns6'
time='MASKED'/>
+ <testcase classname='GGSN_Tests' name='TC_pdp46_act_deact_mtu'
time='MASKED'/>
<testcase classname='GGSN_Tests'
name='TC_pdp46_act_deact_gtpu_access' time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp46_clients_interact'
time='MASKED'/>
<testcase classname='GGSN_Tests' name='TC_pdp46_act_deact_apn4'
time='MASKED'/>
diff --git a/ggsn_tests/gen_links.sh b/ggsn_tests/gen_links.sh
index 45c84bd..cd4c406 100755
--- a/ggsn_tests/gen_links.sh
+++ b/ggsn_tests/gen_links.sh
@@ -58,7 +58,7 @@
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 IPCP_Templates.ttcn
PAP_Types.ttcn "
+FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn
Native_Functions.ttcn Native_FunctionDefs.cc PCO_Types.ttcn IPCP_Types.ttcn
IPCP_Templates.ttcn PAP_Types.ttcn "
FILES+="GTPv1C_CodecPort.ttcn GTPv1C_CodecPort_CtrlFunct.ttcn
GTPv1C_CodecPort_CtrlFunctDef.cc GTPv1C_Templates.ttcn Osmocom_Gb_Types.ttcn "
FILES+="GTPv1U_CodecPort.ttcn GTPv1U_CodecPort_CtrlFunct.ttcn
GTPv1U_CodecPort_CtrlFunctDef.cc GTPv1U_Templates.ttcn "
FILES+="DIAMETER_Types.ttcn DIAMETER_CodecPort.ttcn
DIAMETER_CodecPort_CtrlFunct.ttcn DIAMETER_CodecPort_CtrlFunctDef.cc
DIAMETER_Emulation.ttcn "
diff --git a/library/GTPv1C_Templates.ttcn b/library/GTPv1C_Templates.ttcn
index 9f963f3..766870a 100644
--- a/library/GTPv1C_Templates.ttcn
+++ b/library/GTPv1C_Templates.ttcn
@@ -1291,6 +1291,10 @@
protocols := superset(tr_PCO_Proto('000d'O, 4, contents))
}
+template (value) ProtConfigOptions ts_PCO_MTU modifies ts_PCO := {
+ protocols := { ts_PCO_Proto('0010'O) }
+}
+
/* extract a given protocol payload from PCO */
function f_PCO_extract_proto(ProtConfigOptions pco, OCT2 protocol, integer nth_match :=
1) return octetstring {
var integer i;
diff --git a/library/PCO_Types.ttcn b/library/PCO_Types.ttcn
index 04b5080..4fea861 100644
--- a/library/PCO_Types.ttcn
+++ b/library/PCO_Types.ttcn
@@ -52,13 +52,24 @@
return int2oct(enum2int(p), 2);
}
-type set of ProtocolElement ProtocolIDList;
+type record ProtocolElementU16 {
+ uint16_t val
+};
+
+type union ProtocolElementPayloadUnion {
+ ProtocolElementU16 u16,
+ octetstring octstr
+};
type record ProtocolElement {
PCO_P protocolID,
uint8_t lengthProtoID,
- octetstring protoIDContents
-} with { variant (lengthProtoID) "LENGTHTO(protoIDContents)" };
+ ProtocolElementPayloadUnion u
+} with { variant (lengthProtoID) "LENGTHTO(u)"
+ variant (u) "CROSSTAG(u16, protocolID = PCO_P_IPv4_LINK_MTU;
+ octstr, OTHERWISE)"
+ };
+type set of ProtocolElement ProtocolIDList;
type record PCO_DATA {
BIT1 extension0,
@@ -77,13 +88,46 @@
* PCO_Templates:
**********************/
+/* Union value (payload) templates */
+template (value) ProtocolElementU16 ts_PCO_P_UV_U16(template (value) uint16_t val)
+:= { val := val }
+template (present) ProtocolElementU16 tr_PCO_P_UV_U16(template (present) uint16_t val :=
?)
+:= { val := val }
+
+/* Union templates */
+template (value) ProtocolElementPayloadUnion ts_PCO_P_U_U16(template (value) uint16_t
val)
+:= { u16 := ts_PCO_P_UV_U16(val) }
+template (present) ProtocolElementPayloadUnion tr_PCO_P_U_U16(template (present) uint16_t
val := ?)
+:= { u16 := tr_PCO_P_UV_U16(val) }
+
+template (value) ProtocolElementPayloadUnion ts_PCO_P_U_OCTSTR(template (value)
octetstring protoIDContents := ''O)
+:= { octstr := protoIDContents }
+template (present) ProtocolElementPayloadUnion tr_PCO_P_U_OCTSTR(template (present)
octetstring protoIDContents := ?)
+:= { octstr := protoIDContents }
+
+/* PCOElement templates */
+template (value) ProtocolElement ts_PCO_P_U16(template (value) PCO_P protocolID,
+ template (value) uint16_t val)
+:= {
+ protocolID := protocolID,
+ lengthProtoID := 2,
+ u := ts_PCO_P_U_U16(val)
+}
+template (present) ProtocolElement tr_PCO_P_U16(template (present) PCO_P protocolID :=
?,
+ template (present) uint16_t val := ?)
+:= {
+ protocolID := protocolID,
+ lengthProtoID := 2,
+ u := tr_PCO_P_U_U16(val)
+}
+
template (value) ProtocolElement ts_PCO_P_OCTSTR(template (value) PCO_P protocolID,
template (value) uint8_t lengthProtoID := 0,
template (value) octetstring protoIDContents := ''O)
:= {
protocolID := protocolID,
lengthProtoID := lengthProtoID,
- protoIDContents := protoIDContents
+ u := ts_PCO_P_U_OCTSTR(protoIDContents)
}
template (present) ProtocolElement tr_PCO_P_OCTSTR(template (present) PCO_P protocolID :=
?,
@@ -92,10 +136,15 @@
:= {
protocolID := protocolID,
lengthProtoID := lengthProtoID,
- protoIDContents := protoIDContents
+ u := tr_PCO_P_U_OCTSTR(protoIDContents)
}
+template (value) ProtocolElement ts_PCO_P_IPv4_LINK_MTU(template (value) uint16_t mtu)
:=
+ ts_PCO_P_U16(PCO_P_IPv4_LINK_MTU, mtu);
+template (present) ProtocolElement tr_PCO_P_IPv4_LINK_MTU(template (present) uint16_t mtu
:= ?) :=
+ tr_PCO_P_U16(PCO_P_IPv4_LINK_MTU, mtu);
+
template (value) ProtocolElement ts_PCO_P_DNS_IPv4(template (value) octetstring dns4 :=
''O) :=
ts_PCO_P_OCTSTR(PCO_P_DNS_IPv4_ADDR, protoIDContents := dns4);
template (present) ProtocolElement tr_PCO_P_DNS_IPv4(template (present) octetstring dns4
:= ?) :=
--
To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38469?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I2ceb76a3a07b44f69937c9f5a040482320bca377
Gerrit-Change-Number: 38469
Gerrit-PatchSet: 5
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>