<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9394">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">GGSN_Tests: test what happens when PCO contains only one DNS entry<br><br>When the protocol configuration options (PCO) contain an IPCP container<br>then lists only one one DNS server (normally there are two included, a<br>primary and a secondary). Than the parser in osmo-ggsn runs into an<br>endles loop. This testcase tries to provoke this behavior by sending<br>PDP CONTEXT ACTIVATE messages with PCO that contain only a single DNS<br>entry per IPCP container.<br><br>The hanging of osmo-ggsn is already fixed (see Depends). However when<br>Primary and Secondary DNS are in separate IPCP containers, then only<br>the first IPCP container is parsed (see also OS#3381)<br><br>Change-Id: I71761e1f9db7ceac3c3df43d2e539f8c8d53c4fc<br>Depends: osmo-msc Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5<br>Closes: OS#3288<br>Related: OS#3381<br>---<br>M ggsn_tests/GGSN_Tests.ttcn<br>M ggsn_tests/expected-results.xml<br>M library/GTP_Templates.ttcn<br>3 files changed, 127 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn</span><br><span>index d099681..97abc4d 100644</span><br><span>--- a/ggsn_tests/GGSN_Tests.ttcn</span><br><span>+++ b/ggsn_tests/GGSN_Tests.ttcn</span><br><span>@@ -932,6 +932,86 @@</span><br><span>                 T_default.stop;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test if the parser can cope with PCO that only contain either a</span><br><span style="color: hsl(120, 100%, 40%);">+     * single primary DNS or a secondary DNS. */</span><br><span style="color: hsl(120, 100%, 40%);">+  testcase TC_pdp4_act_deact_with_single_dns() runs on GT_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Note: an unpatched osmo-ggsn version will enter an endless-loop when</span><br><span style="color: hsl(120, 100%, 40%);">+                * the test is executed.</span><br><span style="color: hsl(120, 100%, 40%);">+               * see also: Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+             var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1);</span><br><span style="color: hsl(120, 100%, 40%);">+               var OCT4 ggsn_ip4_dns2 := f_inet_addr(m_ggsn_ip4_dns2);</span><br><span style="color: hsl(120, 100%, 40%);">+               var octetstring pco_neg_dns;</span><br><span style="color: hsl(120, 100%, 40%);">+          var octetstring pco_neg_dns_expected;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* PCO with primary DNS only */</span><br><span style="color: hsl(120, 100%, 40%);">+               ctx.pco_req := valueof(ts_PCO_IPv4_PRI_DNS_IPCP);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_pdp_ctx_act(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+           pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          pco_neg_dns_expected := '0200000A8106'O & ggsn_ip4_dns1</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Note: The prepended hex bytes encode the following information:</span><br><span style="color: hsl(120, 100%, 40%);">+             * 0x02   = Configuration ACK</span><br><span style="color: hsl(120, 100%, 40%);">+          * 0x00   = Identifier</span><br><span style="color: hsl(120, 100%, 40%);">+                 * 0x000a = Length</span><br><span style="color: hsl(120, 100%, 40%);">+             * 0x81   = Type (Primary DNS Server Address)</span><br><span style="color: hsl(120, 100%, 40%);">+          * 0x06   = Length</span><br><span style="color: hsl(120, 100%, 40%);">+             * (4 byte IP-Address appended) */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (not match(pco_neg_dns, pco_neg_dns_expected)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Primary DNS IPv4 PCO option not found");</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_pdp_ctx_del(ctx, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* PCO with secondary DNS only */</span><br><span style="color: hsl(120, 100%, 40%);">+             ctx.pco_req := valueof(ts_PCO_IPv4_SEC_DNS_IPCP);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_pdp_ctx_act(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+           pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          pco_neg_dns_expected := '0200000A8306'O & ggsn_ip4_dns2</span><br><span style="color: hsl(120, 100%, 40%);">+           if (not match(pco_neg_dns, pco_neg_dns_expected)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Secondary DNS IPv4 PCO option not found");</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_pdp_ctx_del(ctx, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Test if the parser can cope with PCO that contains primary and secondary DNS in a separate IPCP container.</span><br><span style="color: hsl(120, 100%, 40%);">+  * Note: an unpatched osmo-ggsn version will enter an endless-loop when the test is run</span><br><span style="color: hsl(120, 100%, 40%);">+        * see Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288. */</span><br><span style="color: hsl(120, 100%, 40%);">+    testcase TC_pdp4_act_deact_with_separate_dns() runs on GT_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Note: an unpatched osmo-ggsn version will enter an endless-loop when</span><br><span style="color: hsl(120, 100%, 40%);">+                * the test is executed.</span><br><span style="color: hsl(120, 100%, 40%);">+               * see also: Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+             var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1);</span><br><span style="color: hsl(120, 100%, 40%);">+               var OCT4 ggsn_ip4_dns2 := f_inet_addr(m_ggsn_ip4_dns2);</span><br><span style="color: hsl(120, 100%, 40%);">+               var octetstring pco_neg_dns;</span><br><span style="color: hsl(120, 100%, 40%);">+          var octetstring pco_neg_dns_expected;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               ctx.pco_req := valueof(ts_PCO_IPv4_SEPARATE_DNS_IPCP);</span><br><span style="color: hsl(120, 100%, 40%);">+                f_pdp_ctx_act(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         /* Check if primary DNS is contained */</span><br><span style="color: hsl(120, 100%, 40%);">+               pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          pco_neg_dns_expected := '0200000A8106'O & ggsn_ip4_dns1</span><br><span style="color: hsl(120, 100%, 40%);">+           if (not match(pco_neg_dns, pco_neg_dns_expected)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Primary DNS IPv4 PCO option not found");</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_pdp_ctx_del(ctx, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Check if secondary DNS is contained */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Note: this check fill fail due to a bug in osmo-ggsn, see also OS#3381 */</span><br><span style="color: hsl(120, 100%, 40%);">+          pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+          pco_neg_dns_expected := '0200000A8306'O & ggsn_ip4_dns2</span><br><span style="color: hsl(120, 100%, 40%);">+           if (not match(pco_neg_dns, pco_neg_dns_expected)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   setverdict(fail, "Secondary DNS IPv4 PCO option not found");</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_pdp_ctx_del(ctx, '1'B);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  control {</span><br><span>            execute(TC_pdp4_act_deact());</span><br><span>                execute(TC_pdp4_act_deact_ipcp());</span><br><span>@@ -939,6 +1019,8 @@</span><br><span>            execute(TC_pdp4_act_deact_gtpu_access());</span><br><span>            execute(TC_pdp4_clients_interact_with_txseq());</span><br><span>              execute(TC_pdp4_clients_interact_without_txseq());</span><br><span style="color: hsl(120, 100%, 40%);">+            execute(TC_pdp4_act_deact_with_single_dns());</span><br><span style="color: hsl(120, 100%, 40%);">+         execute(TC_pdp4_act_deact_with_separate_dns());</span><br><span> </span><br><span>          execute(TC_pdp6_act_deact());</span><br><span>                execute(TC_pdp6_act_deact_pcodns());</span><br><span>diff --git a/ggsn_tests/expected-results.xml b/ggsn_tests/expected-results.xml</span><br><span>index 1e5da38..383ea39 100644</span><br><span>--- a/ggsn_tests/expected-results.xml</span><br><span>+++ b/ggsn_tests/expected-results.xml</span><br><span>@@ -1,10 +1,17 @@</span><br><span> <?xml version="1.0"?></span><br><span style="color: hsl(0, 100%, 40%);">-<testsuite name='GGSN_Tests' tests='11' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'></span><br><span style="color: hsl(120, 100%, 40%);">+<testsuite name='GGSN_Tests' tests='11' failures='1' errors='0' skipped='0' inconc='0' time='MASKED'></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact' time='MASKED'/></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_ipcp' time='MASKED'/></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_pcodns' time='MASKED'/></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_gtpu_access' time='MASKED'/></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp4_clients_interact' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_with_single_dns' time='MASKED'/></span><br><span style="color: hsl(120, 100%, 40%);">+  <testcase classname='GGSN_Tests' name='TC_pdp4_act_deact_with_separate_dns' time='MASKED'></span><br><span style="color: hsl(120, 100%, 40%);">+    <failure type='fail-verdict'>Secondary DNS IPv4 PCO option not found</span><br><span style="color: hsl(120, 100%, 40%);">+      GGSN_Tests.ttcn:MASKED GGSN_Tests control part</span><br><span style="color: hsl(120, 100%, 40%);">+      GGSN_Tests.ttcn:MASKED TC_pdp4_act_deact_with_separate_dns testcase</span><br><span style="color: hsl(120, 100%, 40%);">+    </failure></span><br><span style="color: hsl(120, 100%, 40%);">+  </testcase></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp6_act_deact' time='MASKED'/></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp6_act_deact_pcodns' time='MASKED'/></span><br><span>   <testcase classname='GGSN_Tests' name='TC_pdp6_act_deact_icmp6' time='MASKED'/></span><br><span>diff --git a/library/GTP_Templates.ttcn b/library/GTP_Templates.ttcn</span><br><span>index 44ec439..a222b2e 100644</span><br><span>--- a/library/GTP_Templates.ttcn</span><br><span>+++ b/library/GTP_Templates.ttcn</span><br><span>@@ -400,6 +400,36 @@</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ template ProtConfigOptions ts_PCO_IPv4_PRI_DNS_IPCP modifies ts_PCO := {</span><br><span style="color: hsl(120, 100%, 40%);">+              protocols := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* dummy PAP entry to check if our parser can cope with a single primary DNS entry</span><br><span style="color: hsl(120, 100%, 40%);">+                     * see Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */</span><br><span style="color: hsl(120, 100%, 40%);">+                     { protocolID := 'C023'O, lengthProtoID := 0, protoIDContents := ''O },</span><br><span style="color: hsl(120, 100%, 40%);">+                        { protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Primary)) }</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     template ProtConfigOptions ts_PCO_IPv4_SEC_DNS_IPCP modifies ts_PCO := {</span><br><span style="color: hsl(120, 100%, 40%);">+              protocols := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* dummy PAP entry to check if our parser can cope with a single secondary DNS entry</span><br><span style="color: hsl(120, 100%, 40%);">+                   * see Change-Id Icffde89f9bc5d8fcadf6e2dd6c0b4de03440edd5 and OS#3288 */</span><br><span style="color: hsl(120, 100%, 40%);">+                     { protocolID := 'C023'O, lengthProtoID := 0, protoIDContents := ''O },</span><br><span style="color: hsl(120, 100%, 40%);">+                        { protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Secondary)) }</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+     template ProtConfigOptions ts_PCO_IPv4_SEPARATE_DNS_IPCP modifies ts_PCO := {</span><br><span style="color: hsl(120, 100%, 40%);">+         protocols := {</span><br><span style="color: hsl(120, 100%, 40%);">+                        /* dummy PAP entry to check if our parser can cope with a primary and secondary DNS</span><br><span style="color: hsl(120, 100%, 40%);">+                    * in separate IPCP containers OS#3381 */</span><br><span style="color: hsl(120, 100%, 40%);">+                     { protocolID := 'C023'O, lengthProtoID := 0, protoIDContents := ''O },</span><br><span style="color: hsl(120, 100%, 40%);">+                        { protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Primary)) },</span><br><span style="color: hsl(120, 100%, 40%);">+                    { protocolID := '8021'O, lengthProtoID := 16, protoIDContents :=</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              enc_IpcpPacket(valueof(ts_IPCP_ReqDNS_Secondary)) }</span><br><span style="color: hsl(120, 100%, 40%);">+           }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  template ProtocolElement tr_PCO_Proto(OCT2 prot_id) := {</span><br><span>             protocolID := prot_id,</span><br><span>               lengthProtoID := ?,</span><br><span>@@ -468,6 +498,13 @@</span><br><span>           ts_IPCP(LCP_Configure_Request, identifier,</span><br><span>                   { tr_IPCP_PrimaryDns('00000000'O), tr_IPCP_SecondaryDns('00000000'O) });</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  template IpcpPacket ts_IPCP_ReqDNS_Primary(uint8_t identifier := 0) :=</span><br><span style="color: hsl(120, 100%, 40%);">+                ts_IPCP(LCP_Configure_Request, identifier,</span><br><span style="color: hsl(120, 100%, 40%);">+                    { tr_IPCP_PrimaryDns('00000000'O) });</span><br><span style="color: hsl(120, 100%, 40%);">+ template IpcpPacket ts_IPCP_ReqDNS_Secondary(uint8_t identifier := 0) :=</span><br><span style="color: hsl(120, 100%, 40%);">+              ts_IPCP(LCP_Configure_Request, identifier,</span><br><span style="color: hsl(120, 100%, 40%);">+                    { tr_IPCP_SecondaryDns('00000000'O) });</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>    function f_teardown_ind_IE(in template (omit) BIT1 ind) return template (omit) TearDownInd {</span><br><span>                 if (istemplatekind(ind, "omit")) {</span><br><span>                         return omit;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9394">change 9394</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9394"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I71761e1f9db7ceac3c3df43d2e539f8c8d53c4fc </div>
<div style="display:none"> Gerrit-Change-Number: 9394 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-CC: Pau Espin Pedrol <pespin@sysmocom.de> </div>