///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// Copyright Test Competence Center (TCC) ETH 2012                           //
//                                                                           //
// 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) have been supplied          //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////
//  File:         SCCP_Mapping.ttcnpp
//  Description:  SCCP <-> MTP3 dual faced port definition
//  Rev:          R6A05
//  Prodnr:       CNL 113 341
//  Updated:      2012-11-05
//  Contact:      http://ttcn.ericsson.se
module SCCP_Mapping
{
import from MTP3asp_Types all;
import from MTP3asp_PortType all;
import from SCCP_Types  all;
import from SCCPasp_Types all;

// *************************************************************************
// *************************************************************************
//SCCP Component related declarations
// *************************************************************************
// *************************************************************************

type integer UnhandledProtocol;

//   SCCPasp_SP_PT SCCP_SP_PORT
//+-----------------+-----------------+
//|              SCCP_CT              /
//|                                   /
//+-----------------+-----------------+
//MTP3asp_SCCP_PT MTP3_SCCP_PORT
//                  |
//

//#ifdef USE_MTP3_DISTRIBUTOR
//Version to internal port
type port MTP3asp_SCCP_PT  message
{
  in  PDU_SCCP;
  out ASP_MTP3_TRANSFERreq_sccp;
}
with 
{ extension 
   "internal user MTP3asp_PT
    out(ASP_MTP3_TRANSFERreq_sccp 
         -> ASP_MTP3_TRANSFERreq: function(f_enc_SCCP_to_MTP))
    in( ASP_MTP3_TRANSFERind
         -> PDU_SCCP: function(f_dec_MTP_to_SCCP),
            - : discard;
        ASP_MTP3_PAUSE -> -: discard;
        ASP_MTP3_RESUME -> -: discard;
        ASP_MTP3_STATUS -> -: discard)
   "
}
/*#else
//Version to external port
type port MTP3asp_SCCP_PT  message
{
  in  PDU_SCCP;
  in  UnhandledProtocol;
  out ASP_MTP3_TRANSFERreq_sccp;
}
with 
{ extension 
   "user MTP3asp_PT
    out(ASP_MTP3_TRANSFERreq_sccp 
         -> ASP_MTP3_TRANSFERreq: function(f_enc_SCCP_to_MTP))
    in( ASP_MTP3_TRANSFERind ->
          PDU_SCCP: function(f_dec_MTP_to_SCCP),
          UnhandledProtocol: function(f_dec_MTP_to_UnhandledProtocol);
        ASP_MTP3_PAUSE -> -: discard;
        ASP_MTP3_RESUME -> -: discard;
        ASP_MTP3_STATUS -> -: discard)
   "
}

function f_dec_MTP_to_UnhandledProtocol(in ASP_MTP3_TRANSFERind pl_in, out UnhandledProtocol pl_out) return integer
{
  pl_out := 1;
  return 0;
} with {extension "prototype(backtrack)" }

#endif
*/

function f_enc_SCCP_to_MTP
 (in  ASP_MTP3_TRANSFERreq_sccp pl_in, 
  out ASP_MTP3_TRANSFERreq pl_out) return integer
{
  var bitstring vl_sio_bit := oct2bit(pl_in.sio);
  var MTP3_Field_sio vl_sio_struct;
  vl_sio_struct.ni := substr(vl_sio_bit,0,2);
  vl_sio_struct.prio := substr(vl_sio_bit,2,2);
  vl_sio_struct.si := substr(vl_sio_bit,4,4);

  pl_out :=
  {
    sio := vl_sio_struct,
    opc := pl_in.opc,
    dpc := pl_in.dpc,
    sls := pl_in.sls,
    data:= enc_PDU_SCCP(pl_in.data)
  }
  return 0;
} with {extension "prototype(backtrack)" }

function f_dec_MTP_to_SCCP
 (in  ASP_MTP3_TRANSFERind pl_in, 
  out PDU_SCCP pl_out) return integer
{
  if (pl_in.sio.si != '0011'B)
  {
    log("The received message is not SCCP. Ignored.");
    return 1;
  }
  pl_out := dec_PDU_SCCP(pl_in.data);

  return 0;
} with {extension "prototype(backtrack)" }



}
