<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/13563">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Pau Espin Pedrol: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ggsn: Verify that there are no duplicate PCO protocolIDs<br><br>Introduce a function to verify there's no duplicate ProtocolIDs<br>in the PCO returned from the GGSN.<br><br>Change-Id: I9d439dab1696196cd125f4d7113b426f1711a405<br>Related: OS#3914<br>---<br>M ggsn_tests/GGSN_Tests.ttcn<br>1 file changed, 37 insertions(+), 0 deletions(-)<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 398aed3..d793d27 100644</span><br><span>--- a/ggsn_tests/GGSN_Tests.ttcn</span><br><span>+++ b/ggsn_tests/GGSN_Tests.ttcn</span><br><span>@@ -726,6 +726,33 @@</span><br><span>              T_default.stop;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* list of protocols where we don't accept duplicates */</span><br><span style="color: hsl(120, 100%, 40%);">+  const OCT2List protocol_ids_nodupes := { 'C021'O, 'C023'O, 'C223'O, '8021'O };</span><br><span style="color: hsl(120, 100%, 40%);">+        private function f_PCO_permits_duplicates(OCT2 id) return boolean {</span><br><span style="color: hsl(120, 100%, 40%);">+           var integer i;</span><br><span style="color: hsl(120, 100%, 40%);">+                for (i := 0; i < lengthof(protocol_ids_nodupes); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (id == protocol_ids_nodupes[i]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          return false;</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%);">+             return true;</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%);">+   /* ensure that every given protocol Identifier exist only exactly once in the PCO */</span><br><span style="color: hsl(120, 100%, 40%);">+  function f_PCO_ensure_no_duplicates(ProtConfigOptions pco) {</span><br><span style="color: hsl(120, 100%, 40%);">+          var OCT2List protocol_ids := {};</span><br><span style="color: hsl(120, 100%, 40%);">+              var integer i, j;</span><br><span style="color: hsl(120, 100%, 40%);">+             for (i := 0; i < lengthof(pco.protocols); i := i+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      var OCT2 id := pco.protocols[i].protocolID;</span><br><span style="color: hsl(120, 100%, 40%);">+                   for (j := 0; j < lengthof(protocol_ids); j := j+1) {</span><br><span style="color: hsl(120, 100%, 40%);">+                               if (not f_PCO_permits_duplicates(id) and id == protocol_ids[j]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                     setverdict(fail,  "Duplicate ProtocolID ", id, " already present in ", pco.protocols);</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%);">+                     protocol_ids := protocol_ids & { id };</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>  /* Test IPv6 context activation for dynamic IPv6 EUA without request of IPv6 DNS */</span><br><span>  testcase TC_pdp6_act_deact() runs on GT_CT {</span><br><span>                 f_init();</span><br><span>@@ -743,6 +770,7 @@</span><br><span>              ctx.pco_req := valueof(ts_PCO_IPv6_DNS);</span><br><span>             f_pdp_ctx_act(ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             /* verify PCO contains both primary and secondary DNS */</span><br><span>             var OCT4 ggsn_ip6_dns1 := f_inet6_addr(m_ggsn_ip6_dns1);</span><br><span>             if (not match(f_PCO_extract_proto(ctx.pco_neg, '0003'O, 1), ggsn_ip6_dns1)) {</span><br><span>@@ -765,6 +793,7 @@</span><br><span>          ctx.pco_req := valueof(ts_PCO_IPv6_DNS);</span><br><span>             f_pdp_ctx_act(ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             //f_send_gtpu(ctx, c_router_solicit);</span><br><span>                //f_send_gtpu(ctx, c_neigh_solicit);</span><br><span> </span><br><span>@@ -865,6 +894,7 @@</span><br><span>               var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));</span><br><span>             ctx.pco_req := valueof(ts_PCO_IPv4_DNS_IPCP);</span><br><span>                f_pdp_ctx_act(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+           f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             /* verify IPCP is at all contained */</span><br><span>                if (not match(ctx.pco_neg, tr_PCO_Contains('8021'O))) {</span><br><span>                      setverdict(fail, "IPCP not found in PCO");</span><br><span>@@ -888,6 +918,7 @@</span><br><span>           ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);</span><br><span>                f_pdp_ctx_act(ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             /* verify PCO contains both primary and secondary DNS */</span><br><span>             var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1);</span><br><span>              if (not match(f_PCO_extract_proto(ctx.pco_neg, '000d'O, 1), ggsn_ip4_dns1)) {</span><br><span>@@ -910,6 +941,7 @@</span><br><span>          ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);</span><br><span>                f_pdp_ctx_act(ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             var OCT4 dns1_addr := f_PCO_extract_proto(ctx.pco_neg, '000d'O);</span><br><span> </span><br><span>                 /* Check if we can use valid global src addr, should work */</span><br><span>@@ -986,6 +1018,7 @@</span><br><span>          /* PCO with primary DNS only */</span><br><span>              ctx.pco_req := valueof(ts_PCO_IPv4_PRI_DNS_IPCP);</span><br><span>            f_pdp_ctx_act(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+           f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             pco_neg_dns := f_PCO_extract_proto(ctx.pco_neg, '8021'O, 1);</span><br><span>                 pco_neg_dns_expected := '0200000A8106'O & ggsn_ip4_dns1</span><br><span>          /* Note: The prepended hex bytes encode the following information:</span><br><span>@@ -1063,10 +1096,12 @@</span><br><span>                 var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span>          ctx.pco_req := valueof(ts_PCO_IPv4_DNS_IPCP);</span><br><span>                f_pdp_ctx_act(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+           f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             /* verify IPCP is at all contained */</span><br><span>                if (not match(ctx.pco_neg, tr_PCO_Contains('8021'O))) {</span><br><span>                      setverdict(fail, "IPCP not found in PCO");</span><br><span>                 }</span><br><span style="color: hsl(120, 100%, 40%);">+             f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             /* verify IPCP contains both primary and secondary IPv4 DNS */</span><br><span>               var IpcpPacket ipcp := dec_IpcpPacket(f_PCO_extract_proto(ctx.pco_neg, '8021'O));</span><br><span>            if (not match(ipcp, tr_IPCP_Ack_DNS(0, ggsn_ip4_dns1, ggsn_ip4_dns2))) {</span><br><span>@@ -1101,6 +1136,7 @@</span><br><span>             ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);</span><br><span>                f_pdp_ctx_act(ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             /* verify PCO contains both primary and secondary IPv4 DNS */</span><br><span>                var OCT4 ggsn_ip4_dns1 := f_inet_addr(m_ggsn_ip4_dns1);</span><br><span>              if (not match(f_PCO_extract_proto(ctx.pco_neg, '000d'O, 1), ggsn_ip4_dns1)) {</span><br><span>@@ -1123,6 +1159,7 @@</span><br><span>                ctx.pco_req := valueof(ts_PCO_IPv6_DNS);</span><br><span>             f_pdp_ctx_act(ctx);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+               f_PCO_ensure_no_duplicates(ctx.pco_neg);</span><br><span>             /* verify PCO contains both primary and secondary IPv6 DNS */</span><br><span>                var OCT4 ggsn_ip6_dns1 := f_inet6_addr(m_ggsn_ip6_dns1);</span><br><span>             if (not match(f_PCO_extract_proto(ctx.pco_neg, '0003'O, 1), ggsn_ip6_dns1)) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13563">change 13563</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/13563"/><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: I9d439dab1696196cd125f4d7113b426f1711a405 </div>
<div style="display:none"> Gerrit-Change-Number: 13563 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>