///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) 2000-2018 Ericsson Telecom AB
//
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v2.0
// which accompanies this distribution, and is available at
// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html
///////////////////////////////////////////////////////////////////////////////
//
//  File:               SNDCP_Types.ttcn
//  Rev:                R2A
//  Prodnr:             CNL 113 576
//  Updated:            2008-01-21
//  Contact:            http://ttcn.ericsson.se
//  Reference:          3GPP TS 44.065 7.0.0
 
module SNDCP_Types
{    

// This module contains the Subnetwork Dependent Convergence Protocol
//  44.065 v7.0.0 with attributes for RAW encoding/decoding.

// According to 3GPP 04.64 - the maximum(!) length of the PDU_SN_UNITDATA and PDU_SN_DATA
// is minimum 140 and maximum 520 octets.
// The actual length of the PDU_SN_UNITDATA and PDU_SN_DATA is given in LLC ASPs or set to a parameter value.
// The possible maximum length of dataSegmentSnUnitdataPdu or dataSegmentSnDataPdu is therefore variable and 
// will depend on this setting.
// The RAW decoder should have no problem decoding these fields when they are simply defined as octetstrings
// and stand at the end of the SNDPC PDUs.
//

//
 
import from General_Types all;

external function enc_PDU_SN(in PDU_SN pdu ) return octetstring
with { extension "prototype(convert)"
       extension "encode(RAW)"
     }
      
external function dec_PDU_SN(in octetstring stream) return PDU_SN
with { extension "prototype(convert)"
       extension "decode(RAW)"
     }
     
type union PDU_SN
{
PDU_SN_UNITDATA    pDU_SN_UNITDATA,
PDU_SN_DATA        pDU_SN_DATA       
} with { variant "TAG (              
		pDU_SN_UNITDATA,       			 snPduType ='1'B;	
		pDU_SN_DATA,      			 snPduType ='0'B		
              )"
};


type record PDU_SN_UNITDATA 
{
 BIT4			   nsapi,
 BIT1		  	   moreBit,
 BIT1             	   snPduType,         
 BIT1			   firstSegmentIndicator, 
 BIT1			   spareBit,                     // set to '0'B
 BIT4			   pcomp optional,
 BIT4			   dcomp optional,
 BIT4			   npduNumber,
 BIT4			   segmentNumber,
 OCT1			   npduNumberContinued,
 octetstring 		   dataSegmentSnUnitdataPdu      
}  with { variant (pcomp)  	  "PRESENCE(firstSegmentIndicator = '1'B)";
          variant (dcomp)  	  "PRESENCE(firstSegmentIndicator = '1'B)"
 };


type record PDU_SN_DATA 
{
 BIT4			   nsapi, 
 BIT1		  	   moreBit,
 BIT1             	   snPduType,         
 BIT1			   firstSegmentIndicator, 
 BIT1			   spareBit,                  // set to '0'B
 BIT4			   pcomp optional,
 BIT4			   dcomp optional,
 OCT1			   npduNumberAck optional,
 octetstring 		   dataSegmentSnDataPdu       

} with { variant (pcomp)  	 	  "PRESENCE(firstSegmentIndicator = '1'B)";
          variant (dcomp)  	 	  "PRESENCE(firstSegmentIndicator = '1'B)";
	  variant (npduNumberAck)  	  "PRESENCE(firstSegmentIndicator = '1'B)"
  };


}with{ encode "RAW"}  // end of module
