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) };