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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ggsn: add tests to validate IPv4v6 pdp ctx<br><br>Add related templates based on 3GPP TS 29.060 Figure 37A and create<br>tests based on existing IPv4 and v6 ones.<br><br>Related: OS#2900<br>Change-Id: I3bab7df5caddc5c8b973c81544f954d5473ac234<br>---<br>M ggsn_tests/GGSN_Tests.ttcn<br>M library/GTP_Templates.ttcn<br>2 files changed, 198 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 3c99fd9..398aed3 100644</span><br><span>--- a/ggsn_tests/GGSN_Tests.ttcn</span><br><span>+++ b/ggsn_tests/GGSN_Tests.ttcn</span><br><span>@@ -257,6 +257,10 @@</span><br><span>                                         not match(cpr.endUserAddress, tr_EuaIPv6(?))) {</span><br><span>                                          setverdict(fail);</span><br><span>                                    }</span><br><span style="color: hsl(120, 100%, 40%);">+                                     if (match(ctx.eua, t_EuaIPv4v6(?, ?)) and</span><br><span style="color: hsl(120, 100%, 40%);">+                                         not match(cpr.endUserAddress, tr_EuaIPv4v6(?, ?))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                              setverdict(fail);</span><br><span style="color: hsl(120, 100%, 40%);">+                                     }</span><br><span>                                    /* Check if PCO response corresponds to request */</span><br><span>                                   if (ispresent(ctx.pco_req)) {</span><br><span>                                                if (match(ctx.pco_req, ts_PCO_IPv4_DNS_CONT) and</span><br><span>@@ -697,6 +701,21 @@</span><br><span>              f_wait_icmp6(ctx, (tr_ICMPv6_ERP,tr_ICMPv6_DU));</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* create ICMPv6 router solicitation deriving link-id from PDP Context EUA */</span><br><span style="color: hsl(120, 100%, 40%);">+ function f_icmpv6_rs_for_pdp46(in PdpContext ctx) return octetstring {</span><br><span style="color: hsl(120, 100%, 40%);">+                var OCT16 interface_id := ctx.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address;</span><br><span style="color: hsl(120, 100%, 40%);">+              return f_gen_icmpv6_router_solicitation(interface_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%);">+   /* generate and encode ICMPv6 neighbor solicitation for PDP Context */</span><br><span style="color: hsl(120, 100%, 40%);">+        function f_gen_icmpv6_neigh_solicit_for_pdp46(in PdpContext ctx) return octetstring {</span><br><span style="color: hsl(120, 100%, 40%);">+         var OCT16 interface_id := ctx.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address;</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT16 link_local := f_ipv6_link_local(interface_id);</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT16 daddr := f_ipv6_sol_node_mcast(link_local);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               return f_gen_icmpv6_neigh_solicit(link_local, daddr, link_local);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Assert we don't receive a ICMPv4/6 echo reply (or unreachable) from GTP */</span><br><span>    function f_wait_gtpu_fail(PdpContext ctx) runs on GT_CT {</span><br><span>            T_default.start;</span><br><span>@@ -1028,6 +1047,154 @@</span><br><span>           f_pdp_ctx_del(ctx, '1'B);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test IPv4v6 context activation for dynamic IPv4v6 EUA without DNS request */</span><br><span style="color: hsl(120, 100%, 40%);">+       testcase TC_pdp46_act_deact() runs on GT_CT {</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_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+           f_pdp_ctx_act(ctx);</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 PDP context activation for dynamic IPv4v6 EUA with IPv4 DNS in IPCP */</span><br><span style="color: hsl(120, 100%, 40%);">+        testcase TC_pdp46_act_deact_ipcp() runs on GT_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+            f_init();</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 PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+           ctx.pco_req := valueof(ts_PCO_IPv4_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%);">+           /* verify IPCP is at all contained */</span><br><span style="color: hsl(120, 100%, 40%);">+         if (not match(ctx.pco_neg, tr_PCO_Contains('8021'O))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       setverdict(fail, "IPCP not found in PCO");</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* verify IPCP contains both primary and secondary IPv4 DNS */</span><br><span style="color: hsl(120, 100%, 40%);">+                var IpcpPacket ipcp := dec_IpcpPacket(f_PCO_extract_proto(ctx.pco_neg, '8021'O));</span><br><span style="color: hsl(120, 100%, 40%);">+             if (not match(ipcp, tr_IPCP_Ack_DNS(0, ggsn_ip4_dns1, ggsn_ip4_dns2))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (not match(ipcp, tr_IPCP_Ack_DNS(0))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            setverdict(fail, "Primary/Secondary DNS PCO IPCP option not found");</span><br><span style="color: hsl(120, 100%, 40%);">+                        } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                              setverdict(fail, "Primary/Secondary DNS PCO IPCP option found but not matching expected values");</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%);">+             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 PDP context activation for dynamic IPv4v6 EUA with IPv6 DNS in PCO and router solicitation/advertisement */</span><br><span style="color: hsl(120, 100%, 40%);">+   testcase TC_pdp46_act_deact_icmp6() runs on GT_CT {</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_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+           ctx.pco_req := valueof(ts_PCO_IPv6_DNS);</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%);">+         f_send_gtpu(ctx, f_icmpv6_rs_for_pdp46(ctx));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_wait_rtr_adv(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_send_gtpu(ctx, f_gen_icmpv6_neigh_solicit_for_pdp46(ctx));</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 IPv4v6 context activation for dynamic IPv4v6 EUA with request of IPv4 DNS in PCO */</span><br><span style="color: hsl(120, 100%, 40%);">+   testcase TC_pdp46_act_deact_pcodns4() runs on GT_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+           ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);</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%);">+         /* verify PCO contains both primary and secondary IPv4 DNS */</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%);">+               if (not match(f_PCO_extract_proto(ctx.pco_neg, '000d'O, 1), ggsn_ip4_dns1)) {</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%);">+</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%);">+               if (not match(f_PCO_extract_proto(ctx.pco_neg, '000d'O, 2), ggsn_ip4_dns2)) {</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%);">+</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 IPv4v6 context activation for dynamic IPv4v6 EUA with request of IPv6 DNS in PCO */</span><br><span style="color: hsl(120, 100%, 40%);">+   testcase TC_pdp46_act_deact_pcodns6() runs on GT_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+         f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+           ctx.pco_req := valueof(ts_PCO_IPv6_DNS);</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%);">+         /* verify PCO contains both primary and secondary IPv6 DNS */</span><br><span style="color: hsl(120, 100%, 40%);">+         var OCT4 ggsn_ip6_dns1 := f_inet6_addr(m_ggsn_ip6_dns1);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (not match(f_PCO_extract_proto(ctx.pco_neg, '0003'O, 1), ggsn_ip6_dns1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         setverdict(fail, "Primary DNS IPv6 PCO option not found");</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%);">+           var OCT4 ggsn_ip6_dns2 := f_inet6_addr(m_ggsn_ip6_dns2);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (not match(f_PCO_extract_proto(ctx.pco_neg, '0003'O, 2), ggsn_ip6_dns2)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         setverdict(fail, "Secondary DNS IPv6 PCO option not found");</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%);">+           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 PDP context activation for dynamic IPv4v6 EUA.</span><br><span style="color: hsl(120, 100%, 40%);">+           Test we can send ICMPv6 ping over GTPU to DNS server. */</span><br><span style="color: hsl(120, 100%, 40%);">+   testcase TC_pdp46_act_deact_gtpu_access() runs on GT_CT {</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_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+           ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);</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%);">+         var OCT4 dns1_addr := f_PCO_extract_proto(ctx.pco_neg, '000d'O);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Check if we can use valid global src addr, should work */</span><br><span style="color: hsl(120, 100%, 40%);">+          var OCT4 saddr := ctx.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv4_address;</span><br><span style="color: hsl(120, 100%, 40%);">+              f_send_gtpu(ctx, f_gen_icmpv4_echo(saddr, dns1_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+                f_wait_icmp4_echo_reply(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Assert that packets with wrong global src addr are dropped by GGSN */</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT4 saddr_wrong := substr(saddr, 0, 3) & (saddr[3] xor4b '11'O);</span><br><span style="color: hsl(120, 100%, 40%);">+             f_send_gtpu(ctx, f_gen_icmpv4_echo(saddr_wrong, dns1_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+          f_wait_gtpu_fail(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Send an IPv6 RA to APN4, should fail (packet dropped) */</span><br><span style="color: hsl(120, 100%, 40%);">+           var OCT16 saddr_v6 := f_inet6_addr("fde4:8dba:82e1:2000:1:2:3:4");</span><br><span style="color: hsl(120, 100%, 40%);">+          f_send_gtpu(ctx, f_gen_icmpv6_router_solicitation(saddr_v6));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_wait_gtpu_fail(ctx);</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%);">+   /* Validate if different clients (pdp ctx) can reach one another through GGSN. */</span><br><span style="color: hsl(120, 100%, 40%);">+     testcase TC_pdp46_clients_interact() runs on GT_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+          f_init();</span><br><span style="color: hsl(120, 100%, 40%);">+             var PdpContext ctxA := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+          var PdpContext ctxB := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInet46, valueof(t_EuaIPv4Dynv6Dyn)));</span><br><span style="color: hsl(120, 100%, 40%);">+          f_pdp_ctx_act(ctxA);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_send_gtpu(ctxA, f_icmpv6_rs_for_pdp46(ctxA));</span><br><span style="color: hsl(120, 100%, 40%);">+               f_wait_rtr_adv(ctxA);</span><br><span style="color: hsl(120, 100%, 40%);">+         f_send_gtpu(ctxA, f_gen_icmpv6_neigh_solicit_for_pdp46(ctxA));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              f_pdp_ctx_act(ctxB);</span><br><span style="color: hsl(120, 100%, 40%);">+          f_send_gtpu(ctxB, f_icmpv6_rs_for_pdp46(ctxB));</span><br><span style="color: hsl(120, 100%, 40%);">+               f_wait_rtr_adv(ctxB);</span><br><span style="color: hsl(120, 100%, 40%);">+         f_send_gtpu(ctxB, f_gen_icmpv6_neigh_solicit_for_pdp46(ctxB));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT16 addrA_ll := f_ipv6_link_local(ctxA.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address);</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT16 addrB_ll := f_ipv6_link_local(ctxB.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address);</span><br><span style="color: hsl(120, 100%, 40%);">+              var OCT16 addrA_glob := f_ipv6_global(ctxA.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address);</span><br><span style="color: hsl(120, 100%, 40%);">+                var OCT16 addrB_glob := f_ipv6_global(ctxB.eua.endUserAddress.endUserAddressIPv4andIPv6.ipv6_address);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Validate if clients can interact using ll addr. */</span><br><span style="color: hsl(120, 100%, 40%);">+         f_send_gtpu(ctxA, f_gen_icmpv6_echo(addrA_ll, addrB_ll));</span><br><span style="color: hsl(120, 100%, 40%);">+             f_wait_gtpu_fail(ctxB);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Validate if clients can interact using global addr. */</span><br><span style="color: hsl(120, 100%, 40%);">+             f_send_gtpu(ctxA, f_gen_icmpv6_echo(addrA_glob, addrB_glob));</span><br><span style="color: hsl(120, 100%, 40%);">+         f_wait_gtpu_fail(ctxB);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             f_pdp_ctx_del(ctxA, '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>@@ -1044,6 +1211,14 @@</span><br><span>          execute(TC_pdp6_act_deact_gtpu_access());</span><br><span>            execute(TC_pdp6_clients_interact());</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+              execute(TC_pdp46_act_deact());</span><br><span style="color: hsl(120, 100%, 40%);">+                execute(TC_pdp46_act_deact_ipcp());</span><br><span style="color: hsl(120, 100%, 40%);">+           execute(TC_pdp46_act_deact_icmp6());</span><br><span style="color: hsl(120, 100%, 40%);">+          execute(TC_pdp46_act_deact_pcodns4());</span><br><span style="color: hsl(120, 100%, 40%);">+                execute(TC_pdp46_act_deact_pcodns6());</span><br><span style="color: hsl(120, 100%, 40%);">+                execute(TC_pdp46_act_deact_gtpu_access());</span><br><span style="color: hsl(120, 100%, 40%);">+            execute(TC_pdp46_clients_interact());</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>              execute(TC_echo_req_resp());</span><br><span>         }</span><br><span> }</span><br><span>diff --git a/library/GTP_Templates.ttcn b/library/GTP_Templates.ttcn</span><br><span>index 018f6da..bd39e27 100644</span><br><span>--- a/library/GTP_Templates.ttcn</span><br><span>+++ b/library/GTP_Templates.ttcn</span><br><span>@@ -161,6 +161,29 @@</span><br><span>           }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* 3GPP TS 29.060 Figure 37A: End User Address Information Element for IPv4v6 (both static) */</span><br><span style="color: hsl(120, 100%, 40%);">+        template EndUserAddress t_EuaIPv4v6(template OCT4 ip_addr4, template OCT16 ip_addr6) := {</span><br><span style="color: hsl(120, 100%, 40%);">+             type_gtpc := '80'O,</span><br><span style="color: hsl(120, 100%, 40%);">+           endUserAddress := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   endUserAddressIPv4andIPv6 := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                lengthf := 2,</span><br><span style="color: hsl(120, 100%, 40%);">+                         pdp_typeorg := '0001'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                               spare := '1111'B,</span><br><span style="color: hsl(120, 100%, 40%);">+                             pdp_typenum := '8D'O,</span><br><span style="color: hsl(120, 100%, 40%);">+                         ipv4_address := ip_addr4,</span><br><span style="color: hsl(120, 100%, 40%);">+                             ipv6_address := ip_addr6</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 style="color: hsl(120, 100%, 40%);">+     template EndUserAddress t_EuaIPv4Dynv6Dyn := t_EuaIPv4v6(omit, omit);</span><br><span style="color: hsl(120, 100%, 40%);">+ template EndUserAddress tr_EuaIPv4v6(template OCT4 ip_addr4, template OCT16 ip_addr6) modifies t_EuaIPv4v6 := {</span><br><span style="color: hsl(120, 100%, 40%);">+               endUserAddress := {</span><br><span style="color: hsl(120, 100%, 40%);">+                   endUserAddressIPv4andIPv6 := {</span><br><span style="color: hsl(120, 100%, 40%);">+                                lengthf := 2+lengthof(ip_addr4)+lengthof(ip_addr6)</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 style="color: hsl(120, 100%, 40%);">+</span><br><span>  template AccessPointName ts_APN(octetstring apn) := {</span><br><span>                type_gtpc := '83'O,</span><br><span>          lengthf := lengthof(apn),</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/13231">change 13231</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/13231"/><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: I3bab7df5caddc5c8b973c81544f954d5473ac234 </div>
<div style="display:none"> Gerrit-Change-Number: 13231 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Daniel Willmann <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>