fixeria has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38584?usp=email )


Change subject: library/gsup: rework f_gen_{tr,ts}_ss_ies() and SS templates
......................................................................

library/gsup: rework f_gen_{tr,ts}_ss_ies() and SS templates

* Add missing param restrictions to SS related templates.
* f_gen_{tr,ts}_ss_ies(): proper template param restrictions.
* f_gen_ts_ss_ies(): return a template, not a value.
* f_gen_ts_ss_ies(): append IEs using list index.
* f_gen_ts_ss_ies(): isvalue() -> istemplatekind()
                     to allow passing template lists.
* f_gen_tr_ss_ies(): istemplatekind() -> ispresent()
                     to allow passing template lists.
* f_gen_tr_ss_ies(): 'omit' -> '*' for optional params.

This patch makes the following testcases pass [again]:

* TC_mt_ussd_for_unknown_subscr,
* TC_proc_ss_for_unknown_session.

At some point osmo-msc started including the Source Name IE in
OSMO_GSUP_MSGT_PROC_SS_ERROR messages, which we didn't expect.
We still do not expect that IE, but now we put '*' in place of
the Destination Name IE by default, which matches it.

A follow-up commit will add support fot the Destination Name IE.

Change-Id: Ia611ffa3845d48c5553c70f10981aa029d00d873
---
M library/GSUP_Templates.ttcn
1 file changed, 93 insertions(+), 78 deletions(-)



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

diff --git a/library/GSUP_Templates.ttcn b/library/GSUP_Templates.ttcn
index 21805cb..9a0805e 100644
--- a/library/GSUP_Templates.ttcn
+++ b/library/GSUP_Templates.ttcn
@@ -640,7 +640,7 @@
 }


-template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
+template (value) GSUP_IE ts_GSUP_IE_Cause(template (value) integer cause) := {
        tag := OSMO_GSUP_CAUSE_IE,
        len := 0, /* overwritten */
        val := {
@@ -648,7 +648,7 @@
        }
 }

-template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
+template GSUP_IE tr_GSUP_IE_Cause(template (present) integer cause) := {
        tag := OSMO_GSUP_CAUSE_IE,
        len := ?,
        val := {
@@ -808,14 +808,14 @@
        }
 }

-template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
+template (value) GSUP_IE ts_GSUP_IE_SessionId(template (value) OCT4 sid) := {
        tag := OSMO_GSUP_SESSION_ID_IE,
        len := 0, /* overwritten */
        val := {
                session_id := sid
        }
 }
-template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
+template GSUP_IE tr_GSUP_IE_SessionId(template (present) OCT4 sid) := {
        tag := OSMO_GSUP_SESSION_ID_IE,
        len := ?,
        val := {
@@ -823,14 +823,14 @@
        }
 }

-template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
+template (value) GSUP_IE ts_GSUP_IE_SessionState(template (value) 
GSUP_SessionState state) := {
        tag := OSMO_GSUP_SESSION_STATE_IE,
        len := 0, /* overwritten */
        val := {
                session_state := state
        }
 }
-template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
+template GSUP_IE tr_GSUP_IE_SessionState(template (present) GSUP_SessionState 
state) := {
        tag := OSMO_GSUP_SESSION_STATE_IE,
        len := ?,
        val := {
@@ -1090,14 +1090,14 @@
        }
 }

-template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
+template (value) GSUP_IE ts_GSUP_IE_SSInfo(template (value) octetstring ss) := 
{
        tag := OSMO_GSUP_SS_INFO_IE,
        len := 0, /* overwritten */
        val := {
                ss_info := ss
        }
 }
-template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
+template GSUP_IE tr_GSUP_IE_SSInfo(template (present) octetstring ss) := {
        tag := OSMO_GSUP_SS_INFO_IE,
        len := ?,
        val := {
@@ -1105,7 +1105,7 @@
        }
 }

-template GSUP_IE tr_GSUP_IE_Message_Class(template GSUP_Message_Class val) := {
+template GSUP_IE tr_GSUP_IE_Message_Class(template (present) 
GSUP_Message_Class val) := {
        tag := OSMO_GSUP_MESSAGE_CLASS_IE,
        len := ?,
        val := {
@@ -1113,7 +1113,7 @@
        }
 }

-template (value) GSUP_IE ts_GSUP_IE_Message_Class(GSUP_Message_Class val) := {
+template (value) GSUP_IE ts_GSUP_IE_Message_Class(template (value) 
GSUP_Message_Class val) := {
        tag := OSMO_GSUP_MESSAGE_CLASS_IE,
        len := 0, /* overwritten */
        val := {
@@ -1121,7 +1121,7 @@
        }
 }

-template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {
+template GSUP_IE tr_GSUP_IE_Source_Name(template (present) octetstring name) 
:= {
        tag := OSMO_GSUP_SOURCE_NAME_IE,
        len := ?,
        val := {
@@ -1129,7 +1129,7 @@
        }
 }

-template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {
+template (value) GSUP_IE ts_GSUP_IE_Source_Name(template (value) octetstring 
name) := {
        tag := OSMO_GSUP_SOURCE_NAME_IE,
        len := 0, /* overwritten */
        val := {
@@ -1137,7 +1137,7 @@
        }
 }

-template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {
+template GSUP_IE tr_GSUP_IE_Destination_Name(template (present) octetstring 
name) := {
        tag := OSMO_GSUP_DESTINATION_NAME_IE,
        len := ?,
        val := {
@@ -1145,7 +1145,7 @@
        }
 }

-template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {
+template (value) GSUP_IE ts_GSUP_IE_Destination_Name(template (value) 
octetstring name) := {
        tag := OSMO_GSUP_DESTINATION_NAME_IE,
        len := 0, /* overwritten */
        val := {
@@ -1326,77 +1326,92 @@
        return ies;
 }

-private function f_gen_ts_ss_ies(hexstring imsi,
-                                OCT4 sid,
-                                GSUP_SessionState state,
+private function f_gen_ts_ss_ies(template (value) hexstring imsi,
+                                template (value) OCT4 sid,
+                                template (value) GSUP_SessionState state,
                                 template (omit) octetstring ss := omit,
                                 template (omit) integer cause := omit,
-                                template octetstring source_name := omit)
-return GSUP_IEs {
+                                template (omit) octetstring source_name := 
omit)
+return template (value) GSUP_IEs {
        /* Mandatory IEs */
-       var GSUP_IEs ies := {
-               valueof(ts_GSUP_IE_IMSI(imsi))
+       var template (value) GSUP_IEs ies := {
+               ts_GSUP_IE_IMSI(imsi)
        };
+       var integer idx := lengthof(ies);

-       /* Cause IE is needed for PROC_SS_ERR */
-       if (isvalue(cause)) {
-               ies := ies & { valueof(ts_GSUP_IE_Cause(valueof(cause))) };
+       /* OSMO_GSUP_CAUSE_IE (needed for PROC_SS_ERR) */
+       if (not istemplatekind(cause, "omit")) {
+               ies[idx] := ts_GSUP_IE_Cause(cause);
+               idx := idx + 1;
        }

-       /* Mandatory session IEs */
-       ies := ies & { valueof(ts_GSUP_IE_SessionId(sid)) };
-       ies := ies & { valueof(ts_GSUP_IE_SessionState(state)) };
+       /* OSMO_GSUP_SESSION_{ID,STATE}_IE */
+       ies[idx] := ts_GSUP_IE_SessionId(sid);
+       idx := idx + 1;
+       ies[idx] := ts_GSUP_IE_SessionState(state);
+       idx := idx + 1;

-       /* Optional SS payload */
-       if (isvalue(ss)) {
-               ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };
+       /* OSMO_GSUP_SS_INFO_IE */
+       if (not istemplatekind(ss, "omit")) {
+               ies[idx] := ts_GSUP_IE_SSInfo(ss);
+               idx := idx + 1;
        }

-       if (isvalue(source_name)) {
-               ies := ies & { 
valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
+       /* OSMO_GSUP_SOURCE_NAME_IE */
+       if (not istemplatekind(source_name, "omit")) {
+               ies[idx] := ts_GSUP_IE_Source_Name(source_name);
+               idx := idx + 1;
        }

        return ies;
 }
-private function f_gen_tr_ss_ies(template hexstring imsi,
-                                template OCT4 sid := ?,
-                                template GSUP_SessionState state := ?,
-                                template octetstring ss := omit,
-                                template integer cause := omit,
-                                template octetstring destination_name := omit)
+private function f_gen_tr_ss_ies(template (present) hexstring imsi,
+                                template (present) OCT4 sid := ?,
+                                template (present) GSUP_SessionState state := 
?,
+                                template octetstring ss := *,
+                                template integer cause := *,
+                                template octetstring destination_name := *)
 return template GSUP_IEs {
        /* Mandatory IEs */
        var template GSUP_IEs ies := {
                tr_GSUP_IE_IMSI(imsi)
        };
-       var integer idx := 1;
+       var integer idx := lengthof(ies);

-       /* Cause IE is needed for PROC_SS_ERR */
-       if (istemplatekind(cause, "*")) {
-               ies[idx] := *;
-               idx := idx + 1;
-       } else if (not istemplatekind(cause, "omit")) {
+       /* OSMO_GSUP_CAUSE_IE (needed for PROC_SS_ERR) */
+       if (ispresent(cause)) {
                ies[idx] := tr_GSUP_IE_Cause(cause);
                idx := idx + 1;
-       }
-
-       /* Mandatory session IEs */
-       ies[idx] := tr_GSUP_IE_SessionId(sid);
-       ies[idx + 1] := tr_GSUP_IE_SessionState(state);
-       idx := idx + 2;
-
-       /* Optional SS payload */
-       if (istemplatekind(ss, "*")) {
+       } else if (istemplatekind(cause, "*")) {
                ies[idx] := *;
                idx := idx + 1;
-       } else if (not istemplatekind(ss, "omit")) {
+       }
+
+       /* OSMO_GSUP_SESSION_{ID,STATE}_IE */
+       ies[idx] := tr_GSUP_IE_SessionId(sid);
+       idx := idx + 1;
+       ies[idx] := tr_GSUP_IE_SessionState(state);
+       idx := idx + 1;
+
+       /* OSMO_GSUP_SS_INFO_IE */
+       if (ispresent(ss)) {
                ies[idx] := tr_GSUP_IE_SSInfo(ss);
                idx := idx + 1;
+       } else if (istemplatekind(ss, "*")) {
+               ies[idx] := *;
+               idx := idx + 1;
        }
 
-       if (isvalue(destination_name)) {
+       /* FIXME: OSMO_GSUP_MESSAGE_CLASS_IE goes here */
+       /* TODO: OSMO_GSUP_SOURCE_NAME_IE goes here */
+
+       /* OSMO_GSUP_DESTINATION_NAME_IE */
+       if (ispresent(destination_name)) {
                ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
                idx := idx + 1;
+       } else if (istemplatekind(destination_name, "*")) {
+               ies[idx] := *;
+               idx := idx + 1;
        }

        /* the GSUP Message Class IE is optional, as old implementations don't 
have it yet */
@@ -1408,35 +1423,35 @@
 }

 template (value) GSUP_PDU
-ts_GSUP_PROC_SS_REQ(hexstring imsi,
-                   OCT4 sid,
-                   GSUP_SessionState state,
+ts_GSUP_PROC_SS_REQ(template (value) hexstring imsi,
+                   template (value) OCT4 sid,
+                   template (value) GSUP_SessionState state,
                    template (omit) octetstring ss := omit,
                    template (omit) octetstring source_name := omit) := {
        msg_type := OSMO_GSUP_MSGT_PROC_SS_REQUEST,
        ies := f_gen_ts_ss_ies(imsi, sid, state, ss, source_name := source_name)
 };
-template GSUP_PDU
-tr_GSUP_PROC_SS_REQ(template hexstring imsi,
-                   template OCT4 sid := ?,
-                   template GSUP_SessionState state := ?,
+template (present) GSUP_PDU
+tr_GSUP_PROC_SS_REQ(template (present) hexstring imsi,
+                   template (present) OCT4 sid := ?,
+                   template (present) GSUP_SessionState state := ?,
                    template octetstring ss := *) := {
        msg_type := OSMO_GSUP_MSGT_PROC_SS_REQUEST,
        ies := f_gen_tr_ss_ies(imsi, sid, state, ss)
 };

 template (value) GSUP_PDU
-ts_GSUP_PROC_SS_RES(hexstring imsi,
-                   OCT4 sid,
-                   GSUP_SessionState state,
+ts_GSUP_PROC_SS_RES(template (value) hexstring imsi,
+                   template (value) OCT4 sid,
+                   template (value) GSUP_SessionState state,
                    template (omit) octetstring ss := omit) := {
        msg_type := OSMO_GSUP_MSGT_PROC_SS_RESULT,
        ies := f_gen_ts_ss_ies(imsi, sid, state, ss)
 };
-template GSUP_PDU
-tr_GSUP_PROC_SS_RES(template hexstring imsi,
-                   template OCT4 sid := ?,
-                   template GSUP_SessionState state := ?,
+template (present) GSUP_PDU
+tr_GSUP_PROC_SS_RES(template (present) hexstring imsi,
+                   template (present) OCT4 sid := ?,
+                   template (present) GSUP_SessionState state := ?,
                    template octetstring ss := *,
                    template octetstring destination_name := omit) := {
        msg_type := OSMO_GSUP_MSGT_PROC_SS_RESULT,
@@ -1444,18 +1459,18 @@
 };

 template (value) GSUP_PDU
-ts_GSUP_PROC_SS_ERR(hexstring imsi,
-                   OCT4 sid,
-                   GSUP_SessionState state,
-                   integer cause) := {
+ts_GSUP_PROC_SS_ERR(template (value) hexstring imsi,
+                   template (value) OCT4 sid,
+                   template (value) GSUP_SessionState state,
+                   template (value) integer cause) := {
        msg_type := OSMO_GSUP_MSGT_PROC_SS_ERROR,
        ies := f_gen_ts_ss_ies(imsi, sid, state, cause := cause)
 };
-template GSUP_PDU
-tr_GSUP_PROC_SS_ERR(template hexstring imsi,
-                   template OCT4 sid := ?,
-                   template GSUP_SessionState state := ?,
-                   template integer cause := ?) := {
+template (present) GSUP_PDU
+tr_GSUP_PROC_SS_ERR(template (present) hexstring imsi,
+                   template (present) OCT4 sid := ?,
+                   template (present) GSUP_SessionState state := ?,
+                   template (present) integer cause := ?) := {
        msg_type := OSMO_GSUP_MSGT_PROC_SS_ERROR,
        ies := f_gen_tr_ss_ies(imsi, sid, state, cause := cause)
 };

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

Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ia611ffa3845d48c5553c70f10981aa029d00d873
Gerrit-Change-Number: 38584
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <[email protected]>

Reply via email to