pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/27314 )


Change subject: ggsn: Support rx cause 'New PDP type due to network preference'
......................................................................

ggsn: Support rx cause 'New PDP type due to network preference'

Related: OS#5449
Change-Id: Iace6a4bd0c2372601dc43108ec4eb78602dbcf30
---
M ggsn_tests/GGSN_Tests.ttcn
1 file changed, 75 insertions(+), 34 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks 
refs/changes/14/27314/1

diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index bef7949..247e205 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -331,9 +331,15 @@
                }
        }

-       function f_handle_create_req(inout PdpContext ctx, in Gtp1cUnitdata ud, 
in OCT1 exp_cause := '80'O) runs on GT_CT {
+       function f_handle_create_req(inout PdpContext ctx, in Gtp1cUnitdata ud, 
in template OCT1 exp_cause := '80'O) runs on GT_CT {
                var CreatePDPContextResponse cpr := 
ud.gtpc.gtpc_pdu.createPDPContextResponse;
-               if (exp_cause == '80'O and exp_cause == cpr.cause.causevalue) {
+
+               if (not match(cpr.cause.causevalue, exp_cause)) {
+                       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+                                               "CreatePDPContextResp: cause 
expectancies didn't match");
+               }
+
+               if (cpr.cause.causevalue == '80'O) { /* Accepted */
                        /*  Check if EUA type corresponds to requested type */
                        if (match(ctx.eua, t_EuaIPv4(?)) and
                            not match(cpr.endUserAddress, tr_EuaIPv4(?))){
@@ -350,34 +356,45 @@
                                Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 
fail,
                                                        "EUAv4v6 expectancies 
didn't match");
                        }
-                       /* Check if PCO response corresponds to request */
-                       if (ispresent(ctx.pco_req)) {
-                               if (match(ctx.pco_req, ts_PCO_IPv4_DNS_CONT) and
-                                   not match(cpr.protConfigOptions, 
tr_PCO_IPv4_DNS_CONT_resp(?))) {
-                                       Misc_Helpers.f_shutdown(__BFILE__, 
__LINE__, fail,
-                                                               "IPv4 DNS 
Container requested, but missing");
-                               }
-                               if (match(ctx.pco_req, ts_PCO_IPv6_DNS) and
-                                   not match(cpr.protConfigOptions, 
tr_PCO_IPv6_DNS_resp(?))) {
-                                       Misc_Helpers.f_shutdown(__BFILE__, 
__LINE__, fail,
-                                                               "IPv6 DNS 
Container requested, but missing");
-                               }
+               } else if (cpr.cause.causevalue == '81'O) { /* Cause: New PDP 
type due to network preference */
+                       /* ETSI TS 129 060 7.3.2 Create PDP Context Response. 
OS#5449 */
+                       /* This should only happen if EUA requested type is 
v4v6: */
+                       if (not 
ischosen(ctx.eua.endUserAddress.endUserAddressIPv4andIPv6)) {
+                               Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 
fail,
+                                                       "Cause not expected 
when requesting a non v4v6 EUA");
                        }
-                       ctx.teid_remote := cpr.teidDataI.teidDataI;
-                       ctx.teic_remote := 
cpr.teidControlPlane.teidControlPlane;
-                       ctx.eua := cpr.endUserAddress;
-                       ctx.pco_neg := cpr.protConfigOptions;
-                       setverdict(pass);
-               } else if (exp_cause != '80'O and exp_cause == 
cpr.cause.causevalue) {
-                       if (ispresent(cpr.endUserAddress)) {
-                               log("EUA received on createPDPContextResponse 
cause=" & oct2str(cpr.cause.causevalue));
-                               setverdict(fail);
+                       if (not match(cpr.endUserAddress, tr_EuaIPv4(?)) and
+                               not match(cpr.endUserAddress, tr_EuaIPv6(?))) {
+                               Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 
fail,
+                                                       "Cause not expected 
when requesting+receiving EUAv4v6");
                        }
-                       setverdict(pass);
                } else {
-                       Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
-                                               "CreatePDPContextResp: cause 
expectancies didn't match");
+                       if (ispresent(cpr.endUserAddress)) {
+                               Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 
fail,
+                                       "EUA received on 
createPDPContextResponse cause=" & oct2str(cpr.cause.causevalue));
+                       }
+                       setverdict(pass);
+                       return;
                }
+
+               /* Check if PCO response corresponds to request */
+               if (ispresent(ctx.pco_req)) {
+                       if (match(ctx.pco_req, ts_PCO_IPv4_DNS_CONT) and
+                               not match(cpr.protConfigOptions, 
tr_PCO_IPv4_DNS_CONT_resp(?))) {
+                               Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 
fail,
+                                                       "IPv4 DNS Container 
requested, but missing");
+                       }
+                       if (match(ctx.pco_req, ts_PCO_IPv6_DNS) and
+                               not match(cpr.protConfigOptions, 
tr_PCO_IPv6_DNS_resp(?))) {
+                               Misc_Helpers.f_shutdown(__BFILE__, __LINE__, 
fail,
+                                                       "IPv6 DNS Container 
requested, but missing");
+                       }
+               }
+               ctx.teid_remote := cpr.teidDataI.teidDataI;
+               ctx.teic_remote := cpr.teidControlPlane.teidControlPlane;
+               ctx.eua := cpr.endUserAddress;
+               ctx.pco_neg := cpr.protConfigOptions;
+               setverdict(pass);
        }

        function f_handle_update_req(inout PdpContext ctx, in Gtp1cUnitdata ud, 
in OCT1 exp_cause := '80'O) runs on GT_CT {
@@ -420,8 +437,9 @@
        }

        /* send a PDP context activation */
-       function f_pdp_ctx_act(inout PdpContext ctx, OCT1 exp_cause := '80'O) 
runs on GT_CT {
+       function f_pdp_ctx_act(inout PdpContext ctx, template OCT1 exp_cause := 
'80'O) runs on GT_CT return CreatePDPContextResponse {
                var Gtp1cUnitdata ud;
+               var CreatePDPContextResponse cpr;
                var default d;

                log("sending CreatePDP");
@@ -436,10 +454,12 @@
                alt {
                        [] GTPC.receive(tr_GTPC_MsgType(g_peer_c, 
createPDPContextResponse, ctx.teic)) -> value ud {
                                f_handle_create_req(ctx, ud, exp_cause);
+                               cpr := 
ud.gtpc.gtpc_pdu.createPDPContextResponse;
                        }
                }
                deactivate(d);
                T_default.stop;
+               return cpr;
        }

        function f_pdp_ctx_exp_del_req(PdpContext ctx, template (omit) OCT1 
expect_cause := omit, boolean expect_teardown := false) runs on GT_CT {
@@ -1680,18 +1700,39 @@

        /* Test IPv4v6 context activation for dynamic IPv4v6 EUA on a v4-only 
APN */
        testcase TC_pdp46_act_deact_apn4() runs on GT_CT {
+               var CreatePDPContextResponse cpr;
+               var OCT1 cause_accept := '80'O; /* Normal accept cause */
+               var OCT1 cause_new_pdp_type := '81'O; /* Cause: New PDP type 
due to network preference */
+               var OCT1 cause_unknown_pdp := 'DC'O; /* Cause: Unknown PDP 
address or PDP type */
                f_init();
-               /* A typical MS first attempts v4v6, and if rejected, then 
tries v4 and v6 separetly */
                var PdpContext ctx46 := 
valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, 
valueof(t_EuaIPv4Dynv6Dyn)));
-               f_pdp_ctx_act(ctx46, 'DC'O); /* Cause: Unknown PDP address or 
PDP type */
+               cpr := f_pdp_ctx_act(ctx46, (cause_unknown_pdp, 
cause_new_pdp_type));

-               var PdpContext ctx4 := 
valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, 
valueof(t_EuaIPv4Dyn)));
-               f_pdp_ctx_act(ctx4, '80'O); /* Normal accept cause */
+               if (cpr.cause.causevalue == cause_new_pdp_type) {
+                       /* 3GPP TS 23.060 sec 9.2.1: "If the MS requests PDP 
type IPv4v6,
+                        * but the operator preferences dictate the use of a 
single IP
+                        * version only, the PDP type shall be changed to a 
single address
+                        * PDP type (IPv4 or IPv6) and a reason cause shall be 
returned to
+                        * the MS indicating that only the assigned PDP type is 
allowed. In
+                        * this case, the MS shall not request another PDP 
context for the
+                        * other PDP type during the existence of the PDP 
context." */
+                       f_pdp_ctx_del(ctx46, '1'B);
+               } else {
+                       /* 3GPP TS 23.060 sec 9.2.1 NOTE 5: If the MS requests 
PDP type
+                        * IPv4v6, and the PDP context is rejected due to 
"unknown PDP
+                        * type", the MS can attempt to establish dual-stack 
connectivity
+                        * by performing two PDP context request procedures to 
activate an
+                        * IPv4 PDP context and an IPv6 PDP context, both to 
the same APN. A
+                        * typical MS first attempts v4v6, and if rejected, 
then tries v4
+                        * and v6 separetly */
+                       var PdpContext ctx4 := 
valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, 
valueof(t_EuaIPv4Dyn)));
+                       f_pdp_ctx_act(ctx4, '80'O); /* Normal accept cause */

-               var PdpContext ctx6 := 
valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, 
valueof(t_EuaIPv6Dyn)));
-               f_pdp_ctx_act(ctx6, 'DC'O); /* Cause: Unknown PDP address or 
PDP type */
+                       var PdpContext ctx6 := 
valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, 
valueof(t_EuaIPv6Dyn)));
+                       f_pdp_ctx_act(ctx6, 'DC'O); /* Cause: Unknown PDP 
address or PDP type */

-               f_pdp_ctx_del(ctx4, '1'B);
+                       f_pdp_ctx_del(ctx4, '1'B);
+               }
        }

        /* Validate if 2nd CtxCreateReq with increased Recovery IE causes ggsn 
to drop 1st one (while keeping 2nd one). */

--
To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/27314
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Iace6a4bd0c2372601dc43108ec4eb78602dbcf30
Gerrit-Change-Number: 27314
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-MessageType: newchange

Reply via email to