///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// 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:               GTPU_Types.ttcn
//  Rev:                R1B
//  Prodnr:             CNL 113 843
//  Contact:            http://ttcn.ericsson.se
//  Reference:          3GPP TS 29.060 v13.5.0, 3GPP TS 29.281 v13.2.0
//
//  This module contains the GTP-U (General Packet Radio Servive Protocol
//   Tunnelling Protocol - User Plane)

module GTPU_Types {

import from General_Types all;

// external encoding/decoding functions
external function enc_PDU_GTPU(in PDU_GTPU gtpu_pdu) return octetstring
with { extension "prototype(convert)"
       extension "encode(RAW)"
}

external function dec_PDU_GTPU(in octetstring udp_pdu) return PDU_GTPU

external function dec_PDU_GTPU_ext(in octetstring udp_pdu) return PDU_GTPU_ext
with { extension "prototype(convert)"
       extension "decode(RAW)"
}


     	
//////////////////////////
// IE definition
//////////////////////////
//Private Extension - 7.7.46
type record of PrivateExtension_gtpu PrivateExtension_gtpu_List;

type record PrivateExtension_gtpu {
  OCT1             type_gtpu,
  LIN2_BO_LAST     lengthf,
  OCT2             extensionID,
  octetstring      extensionValue
} with { variant "PRESENCE( type_gtpu = 'FF'O)"; 
         variant (lengthf) "LENGTHTO(extensionID, extensionValue)";};

//Recovery - 7.7.11
type record Recovery_gtpu {
  OCT1           type_gtpu,
  OCT1           restartCounter 
};

//Extension Header Type List - 7.7.40
type record ExtensionHeaderTypeList_gtpu {
  OCT1             type_gtpu,
  integer          lengthf,
  octetstring      extensionTypesList 
} with { variant (lengthf) "LENGTHTO(extensionTypesList)"; }

//Tunnel Endpoint Identifier Data I - 7.7.13
type record TeidDataI_gtpu {
  OCT1  type_gtpu,
  OCT4  teidDataI 
};

//GSN Address - 7.7.32
type record GSNAddress_gtpu
{
  OCT1            type_gtpu,
  LIN2_BO_LAST	  lengthf,
  octetstring     gSNAddressValue
} with {variant (lengthf) "LENGTHTO(gSNAddressValue)";};

//////////////////////////
// Message definition
//////////////////////////
// Echo Request - 7.2.1
type record EchoRequest_IEs {
  PrivateExtension_gtpu_List  private_extension_gtpu  optional
} 

// Echo Response - 7.2.2
type record EchoResponse_IEs {
  Recovery_gtpu  	  recovery_gtpu,
  PrivateExtension_gtpu_List   private_extension_gtpu  optional
} 
  
//Error Indication -  3GPP TS 29.281 v13.2.0 - 7.3.1
type record ErrorIndication_IEs {
  TeidDataI_gtpu   	  teidDataI_gtpu,
  GSNAddress_gtpu         gSNAddress_gtpu,
  PrivateExtension_gtpu_List   private_extension_gtpu  optional
}

//Supported Extension Headers Notification - 7.2.4
type record SupportedExtensionHeadersNotification_IEs {
  ExtensionHeaderTypeList_gtpu extensionHeaderTypeList_gtpu
};

// 3GPP TS 29.281 v9.3.0 - 7.3.2
type record EndMarker_IEs{
  PrivateExtension_gtpu_List  private_extension_gtpu  optional
} 

//G PDU - 9.3.1
type record G_PDU_IEs {
  octetstring  data
};


type union GTPU_IEs {
  EchoRequest_IEs                             echoRequest_IEs,
  EchoResponse_IEs                            echoResponse_IEs,
  ErrorIndication_IEs                         errorIndication_IEs,
  SupportedExtensionHeadersNotification_IEs   suppExtHeadersNotif_IEs,
  EndMarker_IEs                               endMarker_IEs,
  G_PDU_IEs                                   g_PDU_IEs
};


//////////////////////////
// Extension Header definition
//////////////////////////
type record GTPU_ExtensionHeader {
  integer		lengthfield,
  octetstring 		content,
  OCT1            nextExtHeader
} with {
         variant (lengthfield) "LENGTHTO(lengthfield,content,nextExtHeader)";
         variant (lengthfield) "UNIT(32)";        
       }

type record of GTPU_ExtensionHeader GTPU_ExtensionHeader_List;

type record GTPU_Header_optional_part {
  OCT2                       sequenceNumber,
  OCT1                       npduNumber,
  OCT1                       nextExtHeader,
  GTPU_ExtensionHeader_List  gTPU_extensionHeader_List optional
} 
   

//////////////////////////
// PDU definition
//////////////////////////
type record PDU_GTPU {
  BIT1             pn_bit,
  BIT1             s_bit,
  BIT1             e_bit,
  BIT1             spare,
  BIT1             pt,
  BIT3             version,
  OCT1             messageType,
  LIN2_BO_LAST     lengthf,
  OCT4             teid,
  GTPU_Header_optional_part opt_part optional,
  GTPU_IEs         gtpu_IEs
} with { 
    variant (lengthf)  "LENGTHTO(opt_part, gtpu_IEs)";
    variant (opt_part) "PRESENCE({pn_bit = '1'B, s_bit = '1'B, e_bit = '1'B})";
    variant (gtpu_IEs) "CROSSTAG( echoRequest_IEs,     messageType = '01'O;
                                  echoResponse_IEs,    messageType = '02'O;
                                  errorIndication_IEs, messageType = '1A'O;
                                  suppExtHeadersNotif_IEs, messageType = '1F'O;
                                  endMarker_IEs,       messageType = 'FE'O;
                                  g_PDU_IEs,           messageType = 'FF'O)";
       };


type record PDU_GTPU_ext {
  PDU_GTPU gtpu_pdu,
  octetstring extraOctets
} with {
  variant "" ;
};

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

