From 33e5261154f12e21321c8090c4fd276295066d45 Mon Sep 17 00:00:00 2001 From: Philipp Maier Date: Wed, 30 May 2018 17:22:02 +0200 Subject: GGSN_Tests: test what happens when PCO contains only one DNS entry When the protocol configuration options (PCO) contain an IPCP container then lists only one one DNS server (normally there are two included, a primary and a secondary). Than the parser in osmo-ggsn runs into an endles loop. This testcase tries to provoke this behavior by sending PDP CONTEXT ACTIVATE messages with PCO that contain only a single DNS entry per IPCP container. The hanging of osmo-ggsn is already fixed (see Depends). However when Primary and Secondary DNS are in separate IPCP containers, then only the first IPCP container is parsed (see also OS#3381) Change-Id: I71761e1f9db7ceac3c3df43d2e539f8c8d53c4fc Depends: osmo-msc Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 Closes: OS#3288 Related: OS#3381 --- ggsn_tests/GGSN_Tests.ttcn | 82 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) (limited to 'ggsn_tests/GGSN_Tests.ttcn') diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn index d0996810..97abc4d7 100644 --- a/ggsn_tests/GGSN_Tests.ttcn +++ b/ggsn_tests/GGSN_Tests.ttcn @@ -932,6 +932,86 @@ module GGSN_Tests { T_default.stop; } + /* Test if the parser can cope with PCO that only contain either a + * single primary DNS or a secondary DNS. */ + testcase TC_pdp4_act_deact_with_single_dns() runs on GT_CT { + + /* Note: an unpatched osmo-ggsn version will enter an endless-loop when + * the test is executed. + * see also: Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */ + + f_init(); + var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn))); + var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1); + var OCT4 ggsn_ip4_dns2 := f_inet_addr(m_ggsn_ip4_dns2); + var octetstring pco_neg_dns; + var octetstring pco_neg_dns_expected; + + /* PCO with primary DNS only */ + ctx.pco_req := valueof(ts_PCO_IPv4_PRI_DNS_IPCP); + f_pdp_ctx_act(ctx); + pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1); + pco_neg_dns_expected := '0200000A8106'O & ggsn_ip4_dns1 + /* Note: The prepended hex bytes encode the following information: + * 0x02 = Configuration ACK + * 0x00 = Identifier + * 0x000a = Length + * 0x81 = Type (Primary DNS Server Address) + * 0x06 = Length + * (4 byte IP-Address appended) */ + if (not match(pco_neg_dns, pco_neg_dns_expected)) { + setverdict(fail, "Primary DNS IPv4 PCO option not found"); + } + f_pdp_ctx_del(ctx, '1'B); + + /* PCO with secondary DNS only */ + ctx.pco_req := valueof(ts_PCO_IPv4_SEC_DNS_IPCP); + f_pdp_ctx_act(ctx); + pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1); + pco_neg_dns_expected := '0200000A8306'O & ggsn_ip4_dns2 + if (not match(pco_neg_dns, pco_neg_dns_expected)) { + setverdict(fail, "Secondary DNS IPv4 PCO option not found"); + } + f_pdp_ctx_del(ctx, '1'B); + } + + /* Test if the parser can cope with PCO that contains primary and secondary DNS in a separate IPCP container. + * Note: an unpatched osmo-ggsn version will enter an endless-loop when the test is run + * see Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288. */ + testcase TC_pdp4_act_deact_with_separate_dns() runs on GT_CT { + + /* Note: an unpatched osmo-ggsn version will enter an endless-loop when + * the test is executed. + * see also: Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */ + + f_init(); + var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn))); + var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1); + var OCT4 ggsn_ip4_dns2 := f_inet_addr(m_ggsn_ip4_dns2); + var octetstring pco_neg_dns; + var octetstring pco_neg_dns_expected; + + ctx.pco_req := valueof(ts_PCO_IPv4_SEPARATE_DNS_IPCP); + f_pdp_ctx_act(ctx); + + /* Check if primary DNS is contained */ + pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1); + pco_neg_dns_expected := '0200000A8106'O & ggsn_ip4_dns1 + if (not match(pco_neg_dns, pco_neg_dns_expected)) { + setverdict(fail, "Primary DNS IPv4 PCO option not found"); + } + f_pdp_ctx_del(ctx, '1'B); + + /* Check if secondary DNS is contained */ + /* Note: this check fill fail due to a bug in osmo-ggsn, see also OS#3381 */ + pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1); + pco_neg_dns_expected := '0200000A8306'O & ggsn_ip4_dns2 + if (not match(pco_neg_dns, pco_neg_dns_expected)) { + setverdict(fail, "Secondary DNS IPv4 PCO option not found"); + } + f_pdp_ctx_del(ctx, '1'B); + } + control { execute(TC_pdp4_act_deact()); execute(TC_pdp4_act_deact_ipcp()); @@ -939,6 +1019,8 @@ module GGSN_Tests { execute(TC_pdp4_act_deact_gtpu_access()); execute(TC_pdp4_clients_interact_with_txseq()); execute(TC_pdp4_clients_interact_without_txseq()); + execute(TC_pdp4_act_deact_with_single_dns()); + execute(TC_pdp4_act_deact_with_separate_dns()); execute(TC_pdp6_act_deact()); execute(TC_pdp6_act_deact_pcodns()); -- cgit v1.2.3