///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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_Types.ttcn
//  Rev:                R1B
//  Prodnr:             CNL 113 832
//  Contact:            http://ttcn.ericsson.se
//  Reference:          3GPP TS 24.080 v13.0.0

module SS_Types
{

import from SS_PDU_Defs all;

//Coding functions
external function enc_SS_FacilityInformation (in SS_FacilityInformation pdu) return octetstring;
external function dec_SS_FacilityInformation (in octetstring stream) return SS_FacilityInformation;
external function dec_SS_FacilityInformation_backtrack (in octetstring stream, out SS_FacilityInformation pdu) return integer;

//Type for extracted facilityInformation in Facility IE
type record of SS_Component SS_FacilityInformation;

//24.080 3.6.1
type union SS_Component
{
  SS_Invoke       invoke,
  SS_ReturnResult returnResult,
  SS_ReturnError  returnError,
  SS_Reject       reject
}

}
