initial chekin of code received by Ericsson on 20170410
diff --git a/SCCP_Test/SCCP_Testcases.ttcn b/SCCP_Test/SCCP_Testcases.ttcn
new file mode 100644
index 0000000..0cf1c7a
--- /dev/null
+++ b/SCCP_Test/SCCP_Testcases.ttcn
@@ -0,0 +1,505 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+//
+// Copyright Test Competence Center (TCC) ETH 2007
+//
+//
+//
+// 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_TestCases.ttcn
+//  Description:  SS7 SCCP basic SEA test
+//                according to specification ITU-T SS7 SCCP, ANSI ..., TCC ... 
+//  References:   ITU-T: Recommendation Q.711-Q.714, 
+//                ANSI  T1.112-2001, 
+//                TCC   
+//  Rev:          <RnXnn>
+//  Updated:	    2007.04.12
+//  Contact:      http://ttcn.ericsson.se
+//
+
+
+
+
+//Note : this has been modified to include M3UA Emulation and SCTP Test port  
+//Elemer Lelik 12.04.2017
+
+
+
+module SCCP_Testcases
+{//startmodule
+
+modulepar 
+{
+  hexstring tsp_own_GT := '0614377760'H;
+  hexstring tsp_remote_GT := '0614375760'H;
+  integer tsp_SSN := 2; //8:MSC 5:MAP see 3.4.2.2/Q.713
+  octetstring tsp_SIO := '83'O;//SCCP national
+  integer tsp_own_SPC := 461087; // =0x07091E 
+  integer tsp_remote_SPC := 461086; // =0x07091D
+  integer tsp_SLS := 0;
+  charstring tsp_sccp_serviceType := "mtp3_itu";
+  
+  octetstring MTP3_UserPart_SIO;
+  integer MTP3_UserPart_OPC,
+          MTP3_UserPart_DPC,
+          MTP3_UserPart_SLS
+
+
+  SCTP_Association_Address tsp_address := { 0, "", 0, "" };
+
+}//modulepar
+
+import from General_Types all;
+
+import from M3UA_Types all;
+import from M3UA_Emulation all;
+
+import from MTP3asp_Types all;
+import from MTP3asp_PortType all;
+
+
+import from SCCPasp_Types  all;
+import from SCCP_Types  all;
+import from SCCP_Emulation all;
+
+
+import from SCTPasp_Types all;
+import from SCTPasp_PortType  all;
+
+
+
+
+/*************************************
+*   Components
+**************************************/
+
+
+// Model of MSC:
+type component system_CT {
+ 
+     port SCTPasp_PT           sctp;        
+
+   
+};
+
+
+
+
+// Main test component with behaviour SCCPuserA andSCCPuserB
+type component MTC_CT {
+  var SCCP_PAR_Address v_CalledAddress, v_CallingAddress;
+  var integer v_testvalue;
+  var SCCP_CT vc_SCCP_A ;
+
+  var M3UA_CT vc_M3UA ;
+
+  var MSC_SCCP_MTP3_parameters v_BootA;  
+  var SCCP_PAR_Connection_Id v_cid_A ;
+  
+  port SCCPasp_PT A_PORT; //SCCPuserA   
+}
+
+function initBootParams() runs on MTC_CT 
+{
+  v_BootA :=
+  { sio:=
+    { ni:= substr(oct2bit(tsp_SIO),0,2),
+      prio:= substr(oct2bit(tsp_SIO),2,2),
+      si:= substr(oct2bit(tsp_SIO),4,4)
+    },
+    opc:=tsp_own_SPC,
+    dpc:=tsp_remote_SPC, 
+    sls:=tsp_SLS, 
+    sccp_serviceType:=tsp_sccp_serviceType,
+    ssn:= tsp_SSN
+  };
+  return;
+} //initBootParams
+
+function init() runs on MTC_CT //system system_CT
+{
+  initBootParams();
+  log("v_BootA:",v_BootA);
+   
+  // Protocol Stack  creation & connections:
+  vc_SCCP_A:=SCCP_CT.create;
+  vc_M3UA:=M3UA_CT.create;
+
+  connect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT);
+  connect(vc_M3UA:MTP3_SP_PORT,vc_SCCP_A:MTP3_SCCP_PORT);
+  map(vc_M3UA:SCTP_PORT,system:sctp); 
+  
+  vc_M3UA.start(f_M3UA_Emulation(tsp_address));
+  vc_SCCP_A.start( SCCPStart( v_BootA ) ); // Bootparameters 
+
+ 
+  log( "init() is done");
+  
+}// init
+
+function terminate( ) runs on MTC_CT //system system_CT
+{
+  log( "terminate() started");
+  /*while( all component.running != true )
+  {
+    //waits
+  }*/
+    all component.stop;
+
+  unmap(vc_M3UA:SCTP_PORT,system:sctp); 
+  disconnect(vc_M3UA:MTP3_SP_PORT,vc_SCCP_A:MTP3_SCCP_PORT); 
+  disconnect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT);
+
+  
+    log(" all components stopped");
+    self.stop;
+} //terminate
+
+// function getOddEven returns '0' 
+// if even number of dec digit can be found in GT see Q.713
+function getOddEven( in hexstring pl_GT) return bitstring
+{
+   return int2bit( (lengthof(pl_GT) mod 2) ,1);
+}
+
+function getOddEven_ansi( in hexstring pl_GT) return bitstring
+{
+   if( (lengthof(pl_GT) mod 2) == 0 ) { return '0010'B;} //even
+   else { return '0001'B;} //odd
+}
+
+//******************************************************************
+//function setAddresses_gti0001() runs on MTC_CT
+// Sets CalledAddress and CallingAddress as a gti001-type address
+// according to the cfg file.
+//******************************************************************
+
+function setAddresses_gti0001() runs on MTC_CT
+{
+    if( (tsp_sccp_serviceType == "mtp3_itu") or 
+        (tsp_sccp_serviceType == "mtp3b_itu") or
+        (tsp_sccp_serviceType == "mtp3_ttc") or
+        (tsp_sccp_serviceType == "mtp3b_ttc")
+      ) {
+      v_CalledAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle := {
+          gti0001:= {
+            natureOfAddress := '0000011'B,
+            oddeven := getOddEven( tsp_remote_GT ),
+            globalTitleAddress := tsp_remote_GT
+          }
+        }//globalTitle
+      } // v_CalledAddress
+    
+      v_CallingAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_own_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle:= { 
+          gti0001 := {
+            natureOfAddress := '0000011'B,
+            oddeven := getOddEven( tsp_own_GT ), 
+            globalTitleAddress := tsp_own_GT
+          }
+        }//globalTitle
+      } // v_CallingAddress
+      
+    } else if(
+        (tsp_sccp_serviceType == "mtp3_ansi") or
+        (tsp_sccp_serviceType == "mtp3b_ansi")          
+      ) {
+      
+      v_CalledAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle := {
+          gti0011:= {
+            translationType   := int2oct(7,1),
+            encodingScheme    := getOddEven_ansi( tsp_remote_GT ),        
+            numberingPlan     := '0111'B,  //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1            
+            globalTitleAddress:= tsp_remote_GT
+          }
+        }//globalTitle
+      } // v_CalledAddress
+      
+      v_CallingAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle := {
+          gti0011:= {
+            translationType   := int2oct(7,1),
+            encodingScheme    := getOddEven_ansi( tsp_own_GT ),        
+            numberingPlan     := '0111'B,  //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1            
+            globalTitleAddress:= tsp_own_GT
+          }
+        }//globalTitle
+      } // v_CallingAddress
+    }//if
+    
+}//setAddresses_gti001
+
+function f_SendAndReceive1N_UNITDATA(in octetstring pl_userdata) runs on MTC_CT 
+{
+  var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind;
+  timer TL_timer:= 120.0;
+  TL_timer.start;
+  A_PORT.send( t_ASP_N_UNITDATA_req(  v_CalledAddress,
+                                      v_CallingAddress,
+                                      '00000001'B, //sequence control
+                                      '00000001'B, //return option
+                                      pl_userdata,
+                                      omit ) );
+  alt { 
+    [] A_PORT.receive( tr_ASP_N_UNITDATA_ind ) -> value vl_N_UNITDATA_ind
+      { 
+
+        if( (vl_N_UNITDATA_ind.calledAddress == v_CalledAddress ) and
+        (vl_N_UNITDATA_ind.callingAddress == v_CallingAddress) and 
+        (vl_N_UNITDATA_ind.userData == pl_userdata) )
+        {
+          log("Correct  CalledAddress, CallingAddress and userData received, data are correct");
+          setverdict(pass);
+        }
+        else
+        {
+          log("Some data corrupted");
+          setverdict( fail );
+        }
+      };       
+    [] TL_timer.timeout 
+      { 
+        setverdict( fail );
+        log("Timeout....");
+      };                                
+  } //alt  
+  TL_timer.stop;
+}//f_SendAndReceive1N_UNITDATA
+
+/****************************************************
+Connection Oriented Part
+****************************************************/
+
+/****************************************************
+function f_connect
+Establishes a connection
+(Sends an ASP_SCCP_N_CONNECT_req on A_PORT and waits for 
+N_CONNECT_ind on B_PORT. If it is received, 
+it sends back an ASP_SCCP_N_CONNECT_res on B_PORT and waits for
+N_CONNECT_cfm on A_PORT)
+****************************************************/
+function f_connect() runs on MTC_CT return boolean
+{
+  var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind;
+  var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm;
+  setverdict(none);
+  v_cid_A := 13;
+  timer TL_timer:= 120.0;
+  TL_timer.start; 
+  
+  A_PORT.send( t_ASP_N_CONNECT_req( v_CalledAddress,
+                                    v_CallingAddress,
+                                    omit, //expeditedDataSel
+                                    omit, //QoS
+                                    omit, //userData
+                                    v_cid_A, 
+                                    omit //importance
+                                    ) );
+
+  alt {
+    [] A_PORT.receive( tr_ASP_N_CONNECT_cfm ) -> value vl_N_CONNECT_cfm
+      {
+        setverdict( pass );
+        log("f_connect finished successfully");
+        return true;
+      }
+    [] TL_timer.timeout 
+      {
+        setverdict( fail );
+        log("Timeout....");
+        return false;
+      }
+  }// alt
+  log("f_connect finished");
+  return false;
+}//f_connect
+
+/****************************************************
+function f_send
+Sends an ASP_SCCP_N_DATA_req on A_PORT and waits for answer in
+A_PORT
+****************************************************/
+function f_send(in octetstring pl_userdata) runs on MTC_CT
+{
+  timer TL_timer:= 120.0;
+  TL_timer.start;
+  A_PORT.send( t_ASP_N_DATA_req ( pl_userdata, v_cid_A, omit) ) ;
+  alt {
+    [] A_PORT.receive
+      {
+        setverdict( pass );
+        log("f_connect finished successfully");
+         
+      }
+    [] TL_timer.timeout 
+      {
+        setverdict( fail );
+        log("Timeout....");
+         
+      }
+      
+  } //alt
+}//f_send
+
+//f_disconnect with timeout
+
+function f_disconnect( ) runs on MTC_CT 
+{
+  var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind;
+  timer TL_timer:= 25.0;
+  TL_timer.start;
+  A_PORT.send( t_ASP_N_DISCONNECT_req( omit, // respondingAddress
+                                      0,  //reason : end user originated, see 3.11/Q.713
+                                      omit, //userData
+                                      v_cid_A, 
+                                      omit ))
+  alt {
+ 
+    [] A_PORT.receive
+      {
+        repeat;
+      }
+    [] TL_timer.timeout 
+      { 
+        setverdict( pass );
+        log("Timeout....");
+      };           
+  }//alt
+  
+ 
+}//f_disconnect
+
+//===================================================
+// Testcases
+//===================================================
+
+/****************************************************
+tc_ConnlessSendingShortASP
+Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req
+and receives it in one ASP_SCCP_N_UNITDATA_req.
+SCCP transfers information 
+in udp or (forced) xudp packets.
+****************************************************/
+testcase tc_ConnlessSendingShortASP() runs on MTC_CT 
+{
+  var octetstring vl_userdata;
+  init();
+  setAddresses_gti0001();
+  vl_userdata :='12345678901234567890'O;  
+  f_SendAndReceive1N_UNITDATA( vl_userdata );
+  terminate(); 
+ } //tc_ConnlessSendingShortASP
+
+/****************************************************
+ tc_ConnlessSendingLongASP
+ Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req
+ and receives it in one ASP_SCCP_N_UNITDATA_req.
+ It is used for segmentation and reassembly.
+ SCCP transfers information 
+in xudp packets 
+****************************************************/
+testcase tc_ConnlessSendingLongASP() runs on MTC_CT system system_CT
+{
+  var octetstring vl_userdata;
+  var integer vl_i;  
+  init();
+  setAddresses_gti0001();
+  vl_userdata := ''O;
+  for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) {
+    vl_userdata := vl_userdata &'12345678901234567890'O;  
+  }
+  f_SendAndReceive1N_UNITDATA( vl_userdata );
+  terminate(); 
+}//tc_ConnlessSendingLongASP
+
+/****************************************************
+tc_ConnOrientedShortASPSending
+****************************************************/
+testcase tc_ConnOrientedShortASPSending() runs on MTC_CT system system_CT
+{
+  var octetstring vl_userdata;
+  init();
+  setAddresses_gti0001();
+  vl_userdata := '12345678901234567890'O;
+  if(f_connect())
+  {
+    f_send(vl_userdata);
+    f_disconnect();
+  }
+  terminate(); 
+}
+/****************************************************
+tc_ConnOrientedLongASPSending
+****************************************************/
+testcase tc_ConnOrientedLongASPSending() runs on MTC_CT 
+{
+  var octetstring vl_userdata;
+  var integer vl_i;  
+  init();
+  setAddresses_gti0001();
+  vl_userdata := ''O;
+  for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) {
+    vl_userdata := vl_userdata &'12345678901234567890'O;  
+  }
+  if(f_connect())
+  {
+    f_send(vl_userdata);
+    //f_SendAndReceive1N_UNITDATA( vl_userdata );
+    f_disconnect();
+  }
+  terminate(); 
+}
+/****************************************************
+ CONTROL
+****************************************************/
+control 
+{
+  execute( tc_ConnlessSendingShortASP() );
+  execute( tc_ConnlessSendingLongASP() );
+  execute( tc_ConnOrientedShortASPSending());
+  execute( tc_ConnOrientedLongASPSending());
+}
+
+}//module