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

module MobileL3_Types
{

import from General_Types           all;
import from MobileL3_CommonIE_Types all;
import from MobileL3_GMM_SM_Types   all;
import from MobileL3_MM_Types       all;
import from MobileL3_CC_Types       all;
import from MobileL3_RRM_Types      all;
import from MobileL3_SMS_Types      all;
//import from MobileL3_SS_Types       all;

external function enc_PDU_L3_MS_SGSN(in PDU_L3_MS_SGSN pdu) return octetstring
with { extension "prototype(convert)" extension "encode(RAW)" }
external function enc_PDU_L3_MS_SGSN_fast(in PDU_L3_MS_SGSN pdu, out octetstring stream)
with { extension "prototype(fast)" extension "encode(RAW)" }

// new external function for decoding MS -> SGSN
external function dec_PDU_L3_MS_SGSN(in octetstring stream) return PDU_L3_MS_SGSN
with { extension "prototype(convert)" extension "decode(RAW)" }
external function dec_PDU_L3_MS_SGSN_backtrack(in octetstring stream, out PDU_L3_MS_SGSN pdu) return integer
with { extension "prototype(backtrack)" extension "decode(RAW)" }

// new external function for encoding SGSN -> MS
external function enc_PDU_L3_SGSN_MS(in PDU_L3_SGSN_MS pdu) return octetstring
with { extension "prototype(convert)" extension "encode(RAW)" }
external function enc_PDU_L3_SGSN_MS_fast(in PDU_L3_SGSN_MS pdu, out octetstring stream)
with { extension "prototype(fast)" extension "encode(RAW)" }

external function dec_PDU_L3_SGSN_MS(in octetstring stream) return PDU_L3_SGSN_MS
with { extension "prototype(convert)" extension "decode(RAW)" }
external function dec_PDU_L3_SGSN_MS_backtrack(in octetstring stream, out PDU_L3_SGSN_MS pdu) return integer
with { extension "prototype(backtrack)" extension "decode(RAW)" }

external function enc_PDU_ML3_NW_MS(in PDU_ML3_NW_MS pdu) return octetstring
with { extension "prototype(convert)" extension " encode(RAW)" }
external function enc_PDU_ML3_NW_MS_fast(in PDU_ML3_NW_MS pdu, out octetstring stream)
with { extension "prototype(fast)" extension " encode(RAW)" }

external function dec_PDU_ML3_NW_MS(in octetstring stream) return PDU_ML3_NW_MS
with { extension "prototype(convert)" extension " decode(RAW)" }
external function dec_PDU_ML3_NW_MS_backtrack(in octetstring stream, out PDU_ML3_NW_MS pdu) return integer
with { extension "prototype(backtrack)" extension " decode(RAW)" }

external function enc_PDU_ML3_MS_NW(in PDU_ML3_MS_NW pdu) return octetstring
with { extension "prototype(convert)" extension " encode(RAW)" }
external function enc_PDU_ML3_MS_NW_fast(in PDU_ML3_MS_NW pdu, out octetstring stream)
with { extension "prototype(fast)" extension " encode(RAW)" }

external function dec_PDU_ML3_MS_NW(in octetstring stream) return PDU_ML3_MS_NW
with { extension "prototype(convert)" extension " decode(RAW)" }
external function dec_PDU_ML3_MS_NW_backtrack(in octetstring stream, out PDU_ML3_MS_NW pdu) return integer
with { extension "prototype(backtrack)" extension " decode(RAW)" }

// ***************************************************************************
// *     The container types of all L3_PDU
// ***************************************************************************
type record L3_TransactionId
{
  BIT3               tio,
  BIT1               tiFlag ,
  TI_Extension       tIExtension  optional
  // an extension octet (TI) can be used for session management messages
  // not yet implemented (see 24.008 clause 10.3.2 for more detail
} with { variant (tIExtension) "PRESENCE(tio = '111'B)" };

type record L3_TransactionId_not_extended
{
  BIT3               tio,
  BIT1               tiFlag
};

type union TiOrSkip_not_extended
{
  BIT4                                   skipIndicator,
  L3_TransactionId_not_extended          transactionId
};


type union TiOrSkip
{
  BIT4               skipIndicator,
  L3_TransactionId   transactionId
};

type union L3_Discr_SGSN_MS
{
  octetstring        gcc,       //group call control
  octetstring        bcc,      // broadcast call control
  octetstring        cc,       // call control; call related SS messages PDU_ypes_CC_MSC_MS
  octetstring        gttp,     // GPRS Transparent Transport Protocol
  octetstring        mm,       // mobility management messages  PDU_DTAP_MM
  octetstring        rrm,      // radio resource management messages PDU_DTAP_RRM
  L3_GMM_SGSN_MS     gprs_mm,  // GPRS mobility management messages
  octetstring        sms,      // SMS messages
  L3_GSM_SGSN_MS     gprs_sm,  // GPRS session management messages
  octetstring        ss,       // non call related SS messages
  octetstring        loc,      // Location services
  octetstring        reserved
};


type record PDU_L3_SGSN_MS_unextended_ti
{
  BIT4                         discriminator,
  TiOrSkip_not_extended        tiOrSkip,
  L3_Discr_SGSN_MS             msgs
} with { variant (msgs)"CROSSTAG(
  gcc,        discriminator='0000'B;
  bcc,        discriminator='0001'B;
  cc,         discriminator='0011'B;
  gttp,       discriminator='0100'B;
  mm,         discriminator='0101'B;
  rrm,        discriminator='0110'B;
  gprs_mm,    discriminator='1000'B;
  sms,        discriminator='1001'B;
  gprs_sm,    discriminator='1010'B;
  ss,         discriminator='1011'B;
  loc,        discriminator='1100'B;
  reserved, { discriminator='0010'B,
  discriminator='0111'B,
  discriminator='1101'B,
  discriminator='1110'B,
  discriminator='1111'B }
  )";
  variant (tiOrSkip)"CROSSTAG(
  skipIndicator,    { discriminator='0000'B,
  discriminator='0001'B,
  discriminator='0010'B,
  discriminator='0100'B,
  discriminator='0101'B,
  discriminator='0110'B,
  discriminator='0111'B,
  discriminator='1000'B,
  discriminator='1100'B,
  discriminator='1101'B,
  discriminator='1110'B,
  discriminator='1111'B };
  transactionId,    { discriminator='0011'B,
  discriminator='1001'B,
  discriminator='1011'B,
  discriminator='1010'B }
  )";
};


type record PDU_L3_SGSN_MS
{
  BIT4               discriminator,
  TiOrSkip           tiOrSkip,
  L3_Discr_SGSN_MS   msgs
}  with { variant (msgs)"CROSSTAG(
  gcc,        discriminator='0000'B;
  bcc,        discriminator='0001'B;
  cc,         discriminator='0011'B;
  gttp,       discriminator='0100'B;
  mm,         discriminator='0101'B;
  rrm,        discriminator='0110'B;
  gprs_mm,    discriminator='1000'B;
  sms,        discriminator='1001'B;
  gprs_sm,    discriminator='1010'B;
  ss,         discriminator='1011'B;
  loc,        discriminator='1100'B;
  reserved, { discriminator='0010'B,
  discriminator='0111'B,
  discriminator='1101'B,
  discriminator='1110'B,
  discriminator='1111'B }
  )";
  variant (tiOrSkip)"CROSSTAG(
  skipIndicator,    { discriminator='0000'B,
  discriminator='0001'B,
  discriminator='0010'B,
  discriminator='0100'B,
  discriminator='0101'B,
  discriminator='0110'B,
  discriminator='0111'B,
  discriminator='1000'B,
  discriminator='1100'B,
  discriminator='1101'B,
  discriminator='1110'B,
  discriminator='1111'B };
  transactionId,    { discriminator='0011'B,
  discriminator='1011'B,
  discriminator='1001'B,
  discriminator='1010'B }
  )";
};


type union L3_Discr_MS_SGSN
{
  octetstring        gcc,      //group call control
  octetstring        bcc,      // broadcast call control
  octetstring        cc,       // call control; call related SS messages PDU_DTAP_CC_MS_MSC
  octetstring        gttp,     // GPRS Transparent Transport Protocol
  octetstring        mm,       // mobility management messages PDU_DTAP_MM
  octetstring        rrm,      // radio resource management messages PDU_DTAP_RRM
  L3_GMM_MS_SGSN     gprs_mm,  // GPRS mobility management messages
  octetstring        sms,      // SMS messages
  L3_GSM_MS_SGSN     gprs_sm,  // GPRS session management messages
  octetstring        ss,  // non call related SS messages
  octetstring        loc, // Location services
  octetstring        reserved
};


type record PDU_L3_MS_SGSN
{
  BIT4               discriminator,
  TiOrSkip           tiOrSkip,
  L3_Discr_MS_SGSN   msgs
} with { variant (msgs)"CROSSTAG(
  gcc,        discriminator='0000'B;
  bcc,        discriminator='0001'B;
  cc,         discriminator='0011'B;
  gttp,       discriminator='0100'B;
  mm,         discriminator='0101'B;
  rrm,        discriminator='0110'B;
  gprs_mm,    discriminator='1000'B;
  sms,        discriminator='1001'B;
  gprs_sm,    discriminator='1010'B;
  ss,         discriminator='1011'B;
  loc,        discriminator='1100'B;
  reserved, { discriminator='0010'B,
  discriminator='0111'B,
  discriminator='1101'B,
  discriminator='1110'B,
  discriminator='1111'B }
  )";
  variant (tiOrSkip)"CROSSTAG(
  skipIndicator,    { discriminator='0000'B,
  discriminator='0001'B,
  discriminator='0010'B,
  discriminator='0100'B,
  discriminator='0101'B,
  discriminator='0110'B,
  discriminator='0111'B,
  discriminator='1000'B,
  discriminator='1100'B,
  discriminator='1101'B,
  discriminator='1110'B,
  discriminator='1111'B };
  transactionId,    { discriminator='0011'B,
  discriminator='1001'B,
  discriminator='1011'B,
  discriminator='1010'B }
  )";
};


//***************************************************************************
//  24.007/11.2.3.1.1 and 24.008/10.2 Protocol Discriminator    NW->MS
//***************************************************************************
type union ML3_Discr_NW_MS
{
  octetstring        gcc,      // group call control                      <- 24.068  WITHDRAWN
  octetstring        bcc,      // broadcast call control                  <- 24.069 WITHDRAWN
  PDU_ML3_CC_NW_MS   cc,       // call control; call related SS messages  <-24.008, implemented
  octetstring        gttp,     // GPRS Transparent Transport Protocol <- not required in MSC
  PDU_ML3_MM         mm,       // mobility management messages        <- 24.008,
  PDU_RRM_NW_MS      rrm,      // radio resource management messages  <- 24.008, 24.018
  octetstring        gprs_mm,  // GPRS mobility management messages   <- Not required in MSC
  // but implemented as L3_GMM_SGSN_MS in L3_Types (SGSN)
  L3_SMS_SGSN_MS     sms,      // SMS messages
  //<-24.011, imported from L3_SMS_Types
  octetstring        gprs_sm,  // GPRS session management messages    <- not required in MSC
  // but impl. as L3_GMM_MS_SGSN in L3_GSM_SGSN_MS_Types
  octetstring  ss,       // non call related SS messages
  //<- 24.080 ASN1 or implemented by ethgbh
  octetstring        loc,      // Location services(LCS)              <- 24.030
  octetstring        reserved
};


// ref: 24.007/11.2.3.1.1 "Protocol discriminator" and
// Table 11.2 "Protocol dicriminator values"
type record PDU_ML3_NW_MS
{
  BIT4             discriminator, //24.008/10.2
  TiOrSkip         tiOrSkip,      //24.008/10.3
  ML3_Discr_NW_MS  msgs
} with { variant (msgs)"CROSSTAG(
  gcc,        discriminator='0000'B;
  bcc,        discriminator='0001'B;
  cc,         discriminator='0011'B;
  gttp,       discriminator='0100'B;
  mm,         discriminator='0101'B;
  rrm,        discriminator='0110'B;
  gprs_mm,    discriminator='1000'B;
  sms,        discriminator='1001'B;
  gprs_sm,    discriminator='1010'B;
  ss,         discriminator='1011'B;
  loc,        discriminator='1100'B;
  reserved, { discriminator='0010'B,
              discriminator='0111'B,
              discriminator='1101'B,
              discriminator='1110'B,
              discriminator='1111'B }
  )";
  variant (tiOrSkip)"CROSSTAG(
  skipIndicator,    { discriminator='0000'B,
                      discriminator='0001'B,
                      discriminator='0010'B,
                      discriminator='0100'B,
                      discriminator='0101'B,
                      discriminator='0110'B,
                      discriminator='0111'B,
                      discriminator='1000'B,
                      discriminator='1100'B,
                      discriminator='1101'B,
                      discriminator='1110'B,
                      discriminator='1111'B };
  transactionId,    { discriminator='0011'B,
                      discriminator='1001'B,
                      discriminator='1011'B,
                      discriminator='1010'B }
  )";
};


type union ML3_Discr_MS_NW
{
  octetstring        gcc,      //group call control
  octetstring        bcc,      // broadcast call control
  PDU_ML3_CC_MS_NW   cc,       // call control; call related SS messages
  octetstring        gttp,     // GPRS Transparent Transport Protocol
  PDU_ML3_MM         mm,       // mobility management messages
  PDU_RRM_MS_NW      rrm,      // radio resource management messages
  octetstring        gprs_mm,  // GPRS mobility management messages
  L3_SMS_MS_SGSN     sms,      // SMS messages
  octetstring        gprs_sm,  // GPRS session management messages
  octetstring        ss,  // non call related SS messages
  octetstring        loc, // Location services
  octetstring        reserved
};

type record PDU_ML3_MS_NW
{
  BIT4                discriminator,
  TiOrSkip            tiOrSkip,
  ML3_Discr_MS_NW     msgs
} with { variant (msgs)"CROSSTAG(
  gcc,        discriminator='0000'B;
  bcc,        discriminator='0001'B;
  cc,         discriminator='0011'B;
  gttp,       discriminator='0100'B;
  mm,         discriminator='0101'B;
  rrm,        discriminator='0110'B;
  gprs_mm,    discriminator='1000'B;
  sms,        discriminator='1001'B;
  gprs_sm,    discriminator='1010'B;
  ss,         discriminator='1011'B;
  loc,        discriminator='1100'B;
  reserved, { discriminator='0010'B,
              discriminator='0111'B,
              discriminator='1101'B,
              discriminator='1110'B,
              discriminator='1111'B }
  )";
  variant (tiOrSkip)"CROSSTAG(
  skipIndicator,    { discriminator='0000'B,
                      discriminator='0001'B,
                      discriminator='0010'B,
                      discriminator='0100'B,
                      discriminator='0101'B,
                      discriminator='0110'B,
                      discriminator='0111'B,
                      discriminator='1000'B,
                      discriminator='1100'B,
                      discriminator='1101'B,
                      discriminator='1110'B,
                      discriminator='1111'B };
  transactionId,    { discriminator='0011'B,    //24.008/10.3.2
                      discriminator='1001'B,
                      discriminator='1011'B,
                      discriminator='1010'B }   //24.008/10.3.2
  )";
};

}//end of module
with {
extension "version R1B"
encode "RAW"
}

