447 lines
15 KiB
C
447 lines
15 KiB
C
|
/*
|
||
|
* tptif.h
|
||
|
*
|
||
|
* Copyright (c) 1993 - 1995 by DataBeam Corporation, Lexington, KY
|
||
|
*
|
||
|
* Abstract:
|
||
|
* This is the interface file for the TransportInterface class.
|
||
|
* This class provides a seamless interface to the TCP transport stack.
|
||
|
*
|
||
|
* The public interface of this class includes a member function for each
|
||
|
* of the API routines that a user application would need to call. The
|
||
|
* only API routines not directly accessible are those used for
|
||
|
* initialization and cleanup (which are automatically executed in the
|
||
|
* constructor and destructor, respectively). When a user application
|
||
|
* needs to call one of the available API routines, it merely calls the
|
||
|
* equivalent member function within the proper instance of this class.
|
||
|
* The API routine will then be invoked using the same parameters.
|
||
|
*
|
||
|
* The destructor calls the cleanup routine within the DLL for which it is
|
||
|
* responsible.
|
||
|
*
|
||
|
* The management plane functions include support for initialization and
|
||
|
* setup, as well as functions allowing MCS to poll the transport
|
||
|
* interfaces for activity.
|
||
|
*
|
||
|
* Caveats:
|
||
|
* None.
|
||
|
*
|
||
|
* Author:
|
||
|
* James P. Galvin, Jr.
|
||
|
*/
|
||
|
#ifndef _TRANSPORTINTERFACE_
|
||
|
#define _TRANSPORTINTERFACE_
|
||
|
|
||
|
#include "tprtsec.h"
|
||
|
|
||
|
/*
|
||
|
* This typedef defines the errors that can be returned from calls that are
|
||
|
* specific to TransportInterface classes. Note that the public member
|
||
|
* functions that map to transport stack calls do not return an error of this
|
||
|
* type. Rather, they return an error as defined by the transport API (TRAPI).
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
TRANSPORT_INTERFACE_NO_ERROR,
|
||
|
TRANSPORT_INTERFACE_INITIALIZATION_FAILED,
|
||
|
TRANSPORT_INTERFACE_ALLOCATION_FAILED,
|
||
|
TRANSPORT_INTERFACE_NO_SUCH_CONNECTION,
|
||
|
TRANSPORT_INTERFACE_CONNECTION_ALREADY_EXISTS
|
||
|
} TransportInterfaceError;
|
||
|
typedef TransportInterfaceError * PTransportInterfaceError;
|
||
|
|
||
|
|
||
|
class CTransportConnList2 : public CList2
|
||
|
{
|
||
|
DEFINE_CLIST2(CTransportConnList2, PConnection, UINT)
|
||
|
void AppendEx(PConnection p, TransportConnection XprtConn)
|
||
|
{
|
||
|
UINT nKey = PACK_XPRTCONN(XprtConn);
|
||
|
Append(nKey, p);
|
||
|
}
|
||
|
PConnection FindEx(TransportConnection XprtConn)
|
||
|
{
|
||
|
UINT nKey = PACK_XPRTCONN(XprtConn);
|
||
|
return Find(nKey);
|
||
|
}
|
||
|
PConnection RemoveEx(TransportConnection XprtConn)
|
||
|
{
|
||
|
UINT nKey = PACK_XPRTCONN(XprtConn);
|
||
|
return Remove(nKey);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
/*
|
||
|
* These are the owner callback messages that a transport interface object
|
||
|
* can send. They correspond directly to the messages that will be received
|
||
|
* from the various transport stacks.
|
||
|
*/
|
||
|
#define CONNECT_CONFIRM 0
|
||
|
#define DISCONNECT_INDICATION 1
|
||
|
#define DATA_INDICATION 2
|
||
|
#define STATUS_INDICATION 3
|
||
|
#define BUFFER_EMPTY_INDICATION 4
|
||
|
#define WAIT_UPDATE_INDICATION 5
|
||
|
|
||
|
/*
|
||
|
* This is simply a forward reference for the class defined below. It is used
|
||
|
* in the definition of the owner callback structure defined in this section.
|
||
|
*/
|
||
|
class TransportInterface;
|
||
|
typedef TransportInterface * PTransportInterface;
|
||
|
|
||
|
/*
|
||
|
* Owner Callback: CONNECT_CONFIRM
|
||
|
* Parameter1: Unused
|
||
|
* Parameter2: TransportConnection transport_connection
|
||
|
*
|
||
|
* Usage:
|
||
|
* This owner callback is sent when a connect confirm is received from
|
||
|
* the transport layer. This is to inform the recipient that a transport
|
||
|
* connection is now available for use. Connect confirm will occur
|
||
|
* on outbound connections. They represent a new transport connection
|
||
|
* that has resulted from this system calling a remote one. As such,
|
||
|
* there should always be a registered owner of the transport connection
|
||
|
* (registration is a side-effect of the call to ConnectRequest).
|
||
|
*
|
||
|
* So the connect confirm will be routed to the object that is the
|
||
|
* registered owner of the transport connection. That object may now
|
||
|
* utilize the connection to transfer data.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Owner Callback: DISCONNECT_INDICATION
|
||
|
* Parameter1: Unused
|
||
|
* Parameter2: TransportConnection transport_connection
|
||
|
*
|
||
|
* Usage:
|
||
|
* This owner callback is sent when a disconnect indication is received
|
||
|
* from the transport layer. This is to inform the recipient that a
|
||
|
* transport connection is no longer available for use. If an object
|
||
|
* has explicitly registered itself as the owner of a transport connection,
|
||
|
* then it will receive the disconnect indication. If there has been no
|
||
|
* such registration, then the disconnect indication will be sent to the
|
||
|
* default owner callback.
|
||
|
*
|
||
|
* Once a disconnect indication has been issued for a given transport
|
||
|
* connection, that connection can no longer be used for anything.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Owner Callback: DATA_INDICATION
|
||
|
* Parameter1: PDataIndicationInfo data_indication_info
|
||
|
* Parameter2: TransportConnection transport_connection
|
||
|
*
|
||
|
* Usage:
|
||
|
* This owner callback is sent when a data indication is received from
|
||
|
* the transport layer. The transport data structure contains the address
|
||
|
* and length of the user data field that is associated with the data
|
||
|
* indication. If an object in the system has explicitly registered
|
||
|
* ownership of the transport connection that carried the data (either
|
||
|
* through ConnectRequest or RegisterTransportConnection), then this
|
||
|
* callback will be sent to that object. If no object has registered
|
||
|
* this transport connection, then the data will be sent to the default
|
||
|
* owner.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Owner Callback: STATUS_INDICATION
|
||
|
* Parameter1: PTransportStatus transport_status
|
||
|
* Parameter2: Unused
|
||
|
*
|
||
|
* Usage:
|
||
|
* This owner callback is just a pass-through of the status indication
|
||
|
* that comes from the transport layer. It contains a pointer to a
|
||
|
* transport status structure that contains status information that
|
||
|
* originated from the stack represented by this object. This is always
|
||
|
* passed to the default owner object.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Owner Callback: BUFFER_EMPTY_INDICATION
|
||
|
* Parameter1: Unused
|
||
|
* Parameter2: TransportConnection transport_connection
|
||
|
*
|
||
|
* Usage:
|
||
|
* This owner callback is a pass-through of the buffer empty indication
|
||
|
* that comes from the transport layer. It is sent to the object that
|
||
|
* has registered ownership of the specified transport connection. This
|
||
|
* indication tells that object that the transport layer can now accept
|
||
|
* more data.
|
||
|
*/
|
||
|
|
||
|
class Connection;
|
||
|
typedef Connection *PConnection;
|
||
|
|
||
|
/*
|
||
|
* This is the class definition for the TransportInterface class. Remember,
|
||
|
* this class contains pure virtual functions which makes it an abstract base
|
||
|
* class. It cannot be instantiated, but rather, exists to be inherited from.
|
||
|
* These derived classes will implement the behavior that is specific to a
|
||
|
* particular transport stack (or possibly just the interface to a particular
|
||
|
* transport stack).
|
||
|
*/
|
||
|
class TransportInterface
|
||
|
{
|
||
|
public:
|
||
|
TransportInterface (
|
||
|
HANDLE transport_transmit_event,
|
||
|
PTransportInterfaceError
|
||
|
transport_interface_error);
|
||
|
~TransportInterface ();
|
||
|
TransportInterfaceError RegisterTransportConnection (
|
||
|
TransportConnection transport_connection,
|
||
|
PConnection owner_object,
|
||
|
BOOL bNoNagle);
|
||
|
#ifdef NM_RESET_DEVICE
|
||
|
TransportError ResetDevice (
|
||
|
PChar device_identifier);
|
||
|
#endif // NM_RESET_DEVICE
|
||
|
TransportError ConnectRequest (
|
||
|
TransportAddress transport_address,
|
||
|
BOOL fSecure,
|
||
|
BOOL bNoNagle,
|
||
|
PConnection owner_object,
|
||
|
PTransportConnection
|
||
|
transport_connection);
|
||
|
void DisconnectRequest (
|
||
|
TransportConnection transport_connection);
|
||
|
void DataRequestReady () {
|
||
|
SetEvent (Transport_Transmit_Event);
|
||
|
};
|
||
|
void ReceiveBufferAvailable ();
|
||
|
BOOL GetSecurity( TransportConnection transport_connection );
|
||
|
|
||
|
PSecurityInterface pSecurityInterface;
|
||
|
TransportInterfaceError CreateConnectionCallback (
|
||
|
TransportConnection transport_connection,
|
||
|
PConnection owner_object);
|
||
|
void ConnectIndication (
|
||
|
TransportConnection transport_connection);
|
||
|
void ConnectConfirm (
|
||
|
TransportConnection transport_connection);
|
||
|
void DisconnectIndication (
|
||
|
TransportConnection transport_connection,
|
||
|
ULONG ulReason);
|
||
|
TransportError DataIndication (
|
||
|
PTransportData transport_data);
|
||
|
void BufferEmptyIndication (
|
||
|
TransportConnection transport_connection);
|
||
|
|
||
|
private:
|
||
|
|
||
|
CTransportConnList2 m_TrnsprtConnCallbackList2;
|
||
|
HANDLE Transport_Transmit_Event;
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* TransportInterface (
|
||
|
* PTransportInterfaceError transport_interface_error)
|
||
|
*
|
||
|
* Functional Description:
|
||
|
* The constructor initializes the TCP transport code.
|
||
|
*
|
||
|
* The constructor also includes parameters specifying the default
|
||
|
* callback. This callback is used to inform the controller whenever an
|
||
|
* unexpected inbound connection is detected. This gives the controller
|
||
|
* the opportunity to assign responsibility for the new connection to some
|
||
|
* other object in the system.
|
||
|
*
|
||
|
* If anything goes wrong in the constructor, the return value (whose
|
||
|
* address is passed as a constructor parameter) will be set to one of the
|
||
|
* failure codes. If this happens, it is expected that whoever invoked the
|
||
|
* constructor (probably the controller), will immediately delete the
|
||
|
* object without using it. Failure to do this WILL result in unexpected
|
||
|
* behavior.
|
||
|
*
|
||
|
* Formal Parameters:
|
||
|
* default_owner_object (i)
|
||
|
* This is the address of the object that will handle all transport
|
||
|
* events for unregistered transport connections. This includes
|
||
|
* connect indication, dicsonnect indication, and data indication.
|
||
|
* This object will also receive all state and message indications.
|
||
|
* default_owner_message_base (i)
|
||
|
* This is the base value to be used for all owner callback messages.
|
||
|
* transport_interface_error (o)
|
||
|
* This is where the return code will be stored so that the creator of
|
||
|
* this object can make sure that everything is okay before using the
|
||
|
* new object. If this value is set to anything but success, the
|
||
|
* object should be destroyed immediately, without being used.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* Note: the return value is handled as a constructor parameter.
|
||
|
* TRANSPORT_INTERFACE_NO_ERROR
|
||
|
* Everything worked, and the object is ready for use.
|
||
|
* TRANSPORT_INTERFACE_INITIALIZATION_FAILED
|
||
|
* The initialization of the transport interface object failed. It is
|
||
|
* therefore necessary to destroy the object without attempting to
|
||
|
* use it.
|
||
|
*
|
||
|
* Side Effects:
|
||
|
* A DLL will be loaded into memory, for later use.
|
||
|
*
|
||
|
* Caveats:
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* ~TransportInterface ()
|
||
|
*
|
||
|
* Functional Description:
|
||
|
* The destructor frees up all resources used by the base class. This
|
||
|
* is primarily associated with the callback list (which is maintained by
|
||
|
* this class).
|
||
|
*
|
||
|
* Formal Parameters:
|
||
|
* Destructors have no parameters.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* Destructors have no return value.
|
||
|
*
|
||
|
* Side Effects:
|
||
|
* None.
|
||
|
*
|
||
|
* Caveats:
|
||
|
* None.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* TransportInterfaceError RegisterTransportConnection (
|
||
|
* TransportConnection transport_connection,
|
||
|
* PConnection owner_object,
|
||
|
* BOOL bNoNagle)
|
||
|
*
|
||
|
* Functional Description:
|
||
|
* When an inbound connection is detected, an entry is created in the
|
||
|
* callback list for it using the default owner callback information (that
|
||
|
* was specified in the constructor). This means that all events detected
|
||
|
* for the new transport connection will be sent to the default owner
|
||
|
* object until another object explicitly registers itself as the owner
|
||
|
* of the transport connection. That is what this routine is used for.
|
||
|
*
|
||
|
* Once an object has registered itself as the owner of a transport
|
||
|
* connection, it will receive all events related to that connection.
|
||
|
*
|
||
|
* Formal Parameters:
|
||
|
* transport_connection (i)
|
||
|
* This is the transport connection for which the callback information
|
||
|
* is to be associated.
|
||
|
* owner_object (i)
|
||
|
* This is the address of the Connection object that is to receive all transport
|
||
|
* layer events for the specified transport connection.
|
||
|
* bNoNagle (i)
|
||
|
* Should the connection stop using the Nagle algorithm?
|
||
|
*
|
||
|
* Return Value:
|
||
|
* TRANSPORT_INTERFACE_NO_ERROR
|
||
|
* The operation completed successfully.
|
||
|
* TRANSPORT_INTERFACE_NO_SUCH_CONNECTION
|
||
|
* This indicates that the named transport connection does not exist.
|
||
|
*
|
||
|
* Side Effects:
|
||
|
* None.
|
||
|
*
|
||
|
* Caveats:
|
||
|
* None.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* TransportError ConnectRequest (
|
||
|
* TransportAddress transport_address,
|
||
|
* BOOL bNoNagle,
|
||
|
* PConnection owner_object,
|
||
|
* PTransportConnection transport_connection)
|
||
|
*
|
||
|
* Functional Description:
|
||
|
* This operation is invoked when the user application wishes to establish
|
||
|
* an outbound connection. Assuming that everything is successful, the
|
||
|
* owner callback information that is passed in to this operation is saved
|
||
|
* for later use. All events for this transport connection will be routed
|
||
|
* to the specified owner rather than the default owner.
|
||
|
*
|
||
|
* Formal Parameters:
|
||
|
* transport_address (i)
|
||
|
* This is the transport address to be passed to the transport stack
|
||
|
* during the connection creation process. The format of this address
|
||
|
* string will vary by transport stack, and cannot be specified here.
|
||
|
* bNoNagle (i)
|
||
|
* Do we need to disable the Nagle algorithm?
|
||
|
* owner_object (i)
|
||
|
* This is the address of the object that is to receive all transport
|
||
|
* layer events for the new transport connection.
|
||
|
* transport_connection (o)
|
||
|
* This is the address of the variable that is to receive the transport
|
||
|
* connection handle that is associated with this connection. Note
|
||
|
* that this handle is assigned before the connection is actually
|
||
|
* established, to allow the application to abort a connection in
|
||
|
* progress.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* TRANSPORT_NO_ERROR
|
||
|
* The operation completed successfully.
|
||
|
* TRANSPORT_NOT_INITIALIZED
|
||
|
* The transport stack is not initialized.
|
||
|
*
|
||
|
* Side Effects:
|
||
|
* An outbound connection establishment process is begun in the background.
|
||
|
*
|
||
|
* Caveats:
|
||
|
* None.
|
||
|
*/
|
||
|
/*
|
||
|
* TransportError DisconnectRequest (
|
||
|
* TransportConnection transport_connection)
|
||
|
*
|
||
|
* Functional Description:
|
||
|
* This operation is used to break an existing transport connection. If
|
||
|
* the operation is successful, the transport connection will be removed
|
||
|
* from the callback list.
|
||
|
*
|
||
|
* Formal Parameters:
|
||
|
* transport_connection (i)
|
||
|
* This is the transport connection that is to be broken.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* TRANSPORT_NO_ERROR
|
||
|
* The operation completed successfully.
|
||
|
* TRANSPORT_NOT_INITIALIZED
|
||
|
* The transport stack is not initialized.
|
||
|
* TRANSPORT_NO_SUCH_CONNECTION
|
||
|
* This indicates that the specified transport connection does not
|
||
|
* exist.
|
||
|
*
|
||
|
* Side Effects:
|
||
|
* A transport connection is severed.
|
||
|
*
|
||
|
* Caveats:
|
||
|
* None.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* TransportError PollReceiver ()
|
||
|
*
|
||
|
* Functional Description:
|
||
|
* This operation is used to check a transport stack for incoming data (or
|
||
|
* other events, such as connect and disconnect indications). In a single
|
||
|
* threaded environment, this call could also be used to provide a
|
||
|
* time-slice for the processing of inbound data, as well as other events
|
||
|
* (such as the creation of new connections).
|
||
|
*
|
||
|
* Formal Parameters:
|
||
|
* None.
|
||
|
*
|
||
|
* Return Value:
|
||
|
* TRANSPORT_NO_ERROR
|
||
|
* The operation completed successfully.
|
||
|
*
|
||
|
* Side Effects:
|
||
|
* This can result in callbacks from the transport layer back into this
|
||
|
* object.
|
||
|
*
|
||
|
* Caveats:
|
||
|
* None.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#endif
|