blob: 7802773735ce8cd954b25a862639f0acb739c3a6 [file] [log] [blame]
// ==================================================================================
// Copyright (c) 2000-2019 Ericsson Telecom AB 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
// ==================================================================================
// Contributors:
// Krisztian Gulyas - initial implementation and initial documentation
//
// File: SimpleTCP.ttcn
// Rev:
// Prodnr:
// ==================================================================================
// ==============================================================================
//
// Helper module for simple TCP/IP communication using the IPL4asp library
//
// ==============================================================================
module SimpleTCP
{
// import basic definitions of TCP/IP communication
import from IPL4asp_Types all;
import from IPL4asp_PortType all;
// basic TCP connection data type
type record ConnectionData {
charstring host, // host name [string]
integer portNumber // port number [integer]
}
// ------------------------------------------------------------------------------
// Helper function for simple TCP message send and receive
//
// 0) Register message lenght callback (function)
// 1) Initalize TCP connection
// 2) Sending out TCP message with given PDU
// 3) if necessary: catching reply message, get PDU
//
// parameters:
// - testPort // IPL4asp_PT type TCP/IP testport [IPL4asp_PT]
// - msgLenCallback // message length function callback
// - local // local host/port [ConnectionData]
// - remote // remote host/port [ConnectionData]
// - pduOut // these octets will be sent out as the part of TCP message [octets]
// - pduIn // these octets are received from incomming TCP message [octets]
// - expectResponse // expected response message from host/port [true/false]
// return:
// - TCP communication was success [true/false]
//
// ------------------------------------------------------------------------------
function sendReceiveMsg (
IPL4asp_PT testPort, // IPL4asp_PT type TCP/IP testport [IPL4asp_PT]
f_IPL4_getMsgLen msgLenCallback,
ConnectionData local,
ConnectionData remote,
in octetstring pduOut,
inout octetstring pduIn,
boolean expectResponse
) return boolean // TCP commution result
{
var boolean res := false; // send/receive result, default = false
var Result connectionResult, closingResult;
// register message lenght callback
f_IPL4_setGetMsgLen(testPort, -1, msgLenCallback, {});
// connect to the socket and check result
connectionResult := f_IPL4_connect(
testPort,
remote.host, remote.portNumber,
local.host, local.portNumber,
-1,
{ tcp := {}},
{
{ reuseAddress := {enable := true} }
});
if (ispresent(connectionResult.errorCode)) {
log(" [!!] TCP port connection error: ", connectionResult);
}
else {
// successfully connected to the given host/port
log(" [::] TCP port [", remote.host, "/", remote.portNumber, "] connected.");
// send and receive TCP message
var ASP_SendTo tcp_msg_send;
var ASP_RecvFrom tcp_msg_received;
// Timer with 0.1 s duration
timer T := 0.1;
// set up TCP message
tcp_msg_send := { connectionResult.connId, remote.host, remote.portNumber, { tcp := {} }, pduOut }
// send out TCP message to the given port
testPort.send(tcp_msg_send);
log(" [=>] TCP message sent...");
// process received message if needed
if (expectResponse) {
// start timer with 0.1 s
T.start;
alt
{
[] testPort.receive(ASP_RecvFrom : ?) -> value tcp_msg_received
{
log(" [<=] TCP message received ");
pduIn := tcp_msg_received.msg;
res := true;
}
[] T.timeout {
log(" [!!] Timeout (no response) ");
}
}
}
else {
log(" [::] Expecting no response");
res := true;
}
// close the connection and check result
closingResult := f_IPL4_close(testPort, connectionResult.connId, { unspecified := {} });
if (ispresent(closingResult.errorCode)) {
log(" [!!] TCP port closing error: ", connectionResult.errorCode);
}
else {
log(" [::] TCP port [", remote.host, "/", remote.portNumber, "] closed");
}
// 0.1 second delay (proper closing of TCP operations)
T.start; T.timeout;
}
return res;
}
}