///////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2000-2019 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:               IP_Daemon_Dynamic_IPL4_CtrlFunct.ttcn

module IP_Daemon_Dynamic_IPL4_CtrlFunct {

  import from IP_Daemon_Dynamic_Interface_Definitions all;
  import from IPL4asp_Types all;
  
  external function f_IPL4_listen(
    inout IPDD_Interface_PT portRef, 
    in HostName locName,
    in PortNumber locPort,
    in ProtoTuple proto,
    in OptionList options := {}
  ) return Result; 

  external function f_IPL4_connect(
    inout IPDD_Interface_PT portRef,
    in HostName remName,
    in PortNumber remPort,
    in HostName locName,
    in PortNumber locPort,
    in ConnectionId connId,
    in ProtoTuple proto,
    in OptionList options := {}
  ) return Result;

  external function f_IPL4_close(
    inout IPDD_Interface_PT portRef,
    in ConnectionId id,
    in ProtoTuple proto := { unspecified := {} }
  ) return Result;

  external function f_IPL4_setUserData(
    inout IPDD_Interface_PT portRef,
    in ConnectionId id,
    in UserData userData
  ) return Result;

  external function f_IPL4_getUserData(
    inout IPDD_Interface_PT portRef,
    in ConnectionId id,
    out UserData userData
  ) return Result;

  external function f_IPL4_setGetMsgLen(
    inout IPDD_Interface_PT portRef,
    in ConnectionId id := -1,
    inout f_getMsgLen f,
    in ro_integer msgLenArgs
  );
  
} // module SCTP_Daemon_Dynamic_IPL4_CtrlFunct

