--/////////////////////////////////////////////////////////////////////////////
--                                                                           //
-- Copyright Test Competence Center (TCC) ETH 2016                           //
--                                                                           //
-- The copyright to the computer  program(s) herein  is the property of TCC. //
-- The program(s) may be used and/or copied only with the written permission //
-- of TCC or in accordance with  the terms and conditions  stipulated in the //
-- agreement/contract under which the program(s) has been supplied.          //
--                                                                           //
--/////////////////////////////////////////////////////////////////////////////
--
--  File:               SS_PDU_Defs.asn
--  Rev:                R1B
--  Prodnr:             CNL 113 832
--  Contact:            http://ttcn.ericsson.se
--  Reference:          3GPP TS 24.080 v13.0.0

SS-PDU-Defs 

DEFINITIONS IMPLICIT TAGS ::=

BEGIN

IMPORTS

  Supported-SS-Operations
  FROM
  SS-Protocol

  OPERATION, ERROR, Code
  FROM Remote-Operations-Information-Objects {joint-iso-itu-t
    remote-operations(4) informationObjects(5) version1(0)}
	  
  Invoke{}, ReturnResult{}, ReturnError{}, Reject{},
  Invoke-help{}, ReturnResult-help{}, ReturnError-help{},
  Errors{}, PresentInvokeId, ProblemType
  FROM Remote-Operations-Generic-ROS-PDUs {joint-iso-itu-t
  remote-operations(4) generic-ROS-PDUs(6) version1(0)};


-- SS-Invoke, SS-ReturnResult, SS-ReturnError, SS-Reject 
-- SS-Invoke-help SS-ReturnResult-help SS-ReturnError-help types
-- (these are accessible from TTCN-3)
SS-Invoke ::= Invoke{{PresentInvokeId}, {Supported-SS-Operations}}

SS-ReturnResult ::= ReturnResult{{Supported-SS-Operations}}

SS-ReturnError ::= ReturnError{{Errors {{Supported-SS-Operations}}}}

SS-Reject ::= Reject --{{Errors {{Supported-SS-Operations}}}}

SS-Invoke-help ::= Invoke-help{{PresentInvokeId}, {Supported-SS-Operations}}

SS-ReturnResult-help ::= ReturnResult-help{{Supported-SS-Operations}}

SS-ReturnError-help ::= ReturnError-help{{Errors {{Supported-SS-Operations}}}}


-- Component Portion fields

-- COMPONENT PORTION. This part is copied from TCAP_PDU_Defs.asn file
-- with TCAP -> SS-TCAP renaming
-- This is needed for internal coding: DON'T USE FROM TTCN !!!
SS-TCAP-ComponentPortion ::= [UNIVERSAL 28] IMPLICIT SEQUENCE (SIZE(1..MAX)) OF
                                                              SS-TCAP-Component


-- COMPONENT TYPE. Recommendation X.229 defines four Application Protocol Data
-- Units (APDUs).

SS-TCAP-Component ::=           CHOICE
  {
  invoke                    [1] IMPLICIT           SS-TCAP-Invoke,
  returnResult              [2] IMPLICIT           SS-TCAP-ReturnResult,
  returnError               [3] IMPLICIT           SS-TCAP-ReturnError,
  reject                    [4] IMPLICIT           SS-TCAP-Reject
  }

-- The Components are sequences of data elements.
SS-TCAP-Invoke ::=              SEQUENCE
  {
  invokeID                            SS-TCAP-InvokeIdType,
  linkedID            [0] IMPLICIT    SS-TCAP-InvokeIdType        OPTIONAL,
  operationCode                       Code,
  parameter                           ANY DEFINED BY operationCode OPTIONAL
  }
     -- ethgry(11/July/02): ANY and ANY DEFINED BY handled in a special,
     -- transparent way at encoding/decoding:
     -- its value notation shall be a simple octet string, which will be
     -- directly copied (i.e without an additional tag and length fields)
     -- into the encoded stream and will be fetched from the received
     -- stream and passed to the abstract level as an octet string.


-- ANY is filled by the single ASN.1 data type following the keyword PARAMETER
-- or the keyword ARGUMENT in the type definition of a particular operation.

SS-TCAP-ReturnResult ::=        SEQUENCE
  {
  invokeID           SS-TCAP-InvokeIdType,
  result             SS-TCAP-ReturnResult-Result OPTIONAL
  }

SS-TCAP-ReturnResult-Result ::= SEQUENCE
  {
   operationCode                   Code,
   parameter                       ANY DEFINED BY operationCode OPTIONAL
      -- ethgry: See comment to Invoke on the use of ANY 
   }

-- ANY is filled by the single ASN.1 data type following the keyword RESULT in
-- the type definition of a particular operation.

SS-TCAP-ReturnError ::=         SEQUENCE
  {
  invokeID                           SS-TCAP-InvokeIdType,
  errorCode                          Code,
  parameter                          ANY DEFINED BY errorCode OPTIONAL
     -- ethgry: See comment to Invoke on the use of ANY
  }

-- ANY is filled by the single ASN.1 data type following the keyword PARAMETER
-- in the type definition of a particular error.
SS-TCAP-Reject ::=              SEQUENCE
  {
  invokeID                                         CHOICE
    {
    derivable                                    SS-TCAP-InvokeIdType,
    not-derivable                                NULL
    },
  problem                                        ProblemType
  }

SS-TCAP-InvokeIdType ::=        INTEGER (-128..127)

END
