/* ProtocolLayer.h * * Copyright (c) 1994-1995 by DataBeam Corporation, Lexington, KY * * Abstract: * This is the base class and backbone of all of the layers * in a Transport Stack. This class provides a framework for the basic * operations expected by a layer in a stack. When all layers inherit * from this class, they can be linked together and none of the layers * needs to know who they are connected with. * * Caveats: * None. * * Authors: * James W. Lawwill */ #ifndef _PROTOCOL_LAYER_H_ #define _PROTOCOL_LAYER_H_ typedef LEGACY_HANDLE LogicalHandle; typedef PHYSICAL_HANDLE PhysicalHandle; // hCommLink /* * TransportPriority is passed in with the TConnectRequest() call. * The user can set the priority of the logical connection. Valid * priorities are 0-14. */ typedef ULONG TransportPriority; #define DEFAULT_PSTN_CALL_CONTROL PLUGXPRT_PSTN_CALL_CONTROL_PORT_HANDLE typedef enum { PROTOCOL_LAYER_NO_ERROR, PROTOCOL_LAYER_REGISTRATION_ERROR, PROTOCOL_LAYER_PACKET_TOO_BIG, PROTOCOL_LAYER_ERROR } ProtocolLayerError; /* ** Message structure used by some classes to hold owner callback ** messages. Sometimes they are processed at later times */ typedef struct { ULONG message; void *parameter1; void *parameter2; void *parameter3; } MessageStruct, * PMessageStruct; /* ** These values make up the data-to-transmit mask. We need a way to ** let the layers know what type of data they can transmit. The controller ** will pass a mask to the layer during the PollTransmitter() call that tells ** the layer if it can transmit CONTROL data, USER data, or both. The layer ** will return a mask telling the controller if it needs to send more ** CONTROL or USER data. It will also tell the controller if it sent any ** data during the call. */ #define PROTOCOL_CONTROL_DATA 0x01 #define PROTOCOL_USER_DATA 0x02 #define PROTOCOL_USER_DATA_ONE_PACKET 0x04 #define PROTOCOL_USER_DATA_TRANSMITTED 0x08 #define DEFAULT_PRIORITY 2 /* ** Messages passed in owner callbacks */ typedef enum { NEW_CONNECTION, BROKEN_CONNECTION, REQUEST_TRANSPORT_CONNECTION, TPRT_CONNECT_INDICATION, TPRT_CONNECT_CONFIRM, TPRT_DISCONNECT_REQUEST, TPRT_DISCONNECT_INDICATION, NETWORK_CONNECT_INDICATION, NETWORK_CONNECT_CONFIRM, NETWORK_DISCONNECT_INDICATION, DATALINK_ESTABLISH_INDICATION, DATALINK_ESTABLISH_CONFIRM, DATALINK_RELEASE_INDICATION, DATALINK_RELEASE_CONFIRM, T123_FATAL_ERROR, T123_STATUS_MESSAGE } CallbackMessage; class IProtocolLayer : public IObject { public: virtual ProtocolLayerError DataRequest ( ULONG_PTR identifier, LPBYTE buffer_address, ULONG length, PULong bytes_accepted) = 0; virtual ProtocolLayerError DataRequest ( ULONG_PTR identifier, PMemory memory, PULong bytes_accepted) = 0; virtual ProtocolLayerError DataIndication ( LPBYTE buffer_address, ULONG length, PULong bytes_accepted) = 0; virtual ProtocolLayerError RegisterHigherLayer ( ULONG_PTR identifier, PMemoryManager memory_manager, IProtocolLayer * higher_layer) = 0; virtual ProtocolLayerError RemoveHigherLayer ( ULONG_PTR identifier) = 0; virtual ProtocolLayerError PollTransmitter ( ULONG_PTR identifier, USHORT data_to_transmit, USHORT * pending_data, USHORT * holding_data) = 0; virtual ProtocolLayerError PollReceiver (void) = 0; virtual ProtocolLayerError GetParameters ( USHORT * max_packet_size, USHORT * prepend_bytes, USHORT * append_bytes) = 0; virtual BOOL PerformAutomaticDisconnect () { return (TRUE); }; }; #endif /* * Documentation for Public class members */ /* * ProtocolLayerError ProtocolLayer::DataRequest ( * USHORT identifier, * LPBYTE buffer_address, * USHORT length, * USHORT * bytes_accepted) = 0; * * Functional Description * This function is called by a higher layer to request data to be * sent out. The function returns the number of bytes accepted from * the packet. If the layer expects stream data layer, it can accept * part of the packet. If it is a packet layer, it MUST accept the * full packet of none of the packet. * * Formal Parameters * identifier - (i) The identifying value of the higher layer * buffer_address - (i) Address of the packet. * length - (i) Length of the packet * bytes_accepted - (o) Number of bytes accepted by the layer. * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * PROTOCOL_LAYER_ERROR - Generic error * PROTOCOL_LAYER_PACKET_TOO_BIG - Packet too big * * Side Effects * None * * Caveats * None */ /* * ProtocolLayerError ProtocolLayer::DataRequest ( * USHORT identifier, * PMemory memory, * PULong bytes_accepted) = 0; * * Functional Description * This function is called by a higher layer to request data to be * sent out. The function returns the number of bytes accepted from * the packet. If the layer expects stream data layer, it can accept * part of the packet. If it is a packet layer, it MUST accept the * full packet of none of the packet. This function does not accept a * buffer address, but it accepts a memory object. This object holds the * buffer address and the length. * * Formal Parameters * identifier - (i) The identifying value of the higher layer * memory - (i) Address of memory object * bytes_accepted - (o) Number of bytes accepted by the layer. * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * PROTOCOL_LAYER_ERROR - Generic error * PROTOCOL_LAYER_PACKET_TOO_BIG - Packet too big * * Side Effects * None * * Caveats * None */ /* * ProtocolLayerError ProtocolLayer::DataIndication ( * LPBYTE buffer_address, * USHORT length, * USHORT * bytes_accepted); * * Functional Description * This function is called by the lower layer when it has data to pass up * * Formal Parameters * buffer_address (i) - Buffer address * length (i) - Number of bytes available * bytes_accepted (o) - Number of bytes accepted * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * * Side Effects * None * * Caveats * None * */ /* * ProtocolLayerError ProtocolLayer::RegisterHigherLayer ( * USHORT identifier, * IProtocolLayer * higher_layer); * * Functional Description * This function is called by the higher layer to register its identifier * and its address. In some cases, the identifier is the DLCI number in * the packet. * * Formal Parameters * identifier (i) - Identifier used to identify the higher layer * higher_layer (i) - Address of higher layer * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * PROTOCOL_LAYER_REGISTRATION_ERROR - Illegal identifier * * Side Effects * None * * Caveats * None * */ /* * ProtocolLayerError ProtocollLayer::RemoveHigherLayer ( * USHORT identifier); * * Functional Description * This function is called by the higher layer to remove the higher layer. * If any more data is received with its identifier on it, it will be * trashed. * * Formal Parameters * identifier (i) - Identifier used to identify the higher layer * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * PROTOCOL_LAYER_REGISTRATION_ERROR - Illegal identifier * * Side Effects * None * * Caveats * None * */ /* * ProtocolLayerError ProtocolLayer::PollTransmitter ( * USHORT identifier, * USHORT data_to_transmit, * USHORT * pending_data); * * Functional Description * This function is called to give the layer a chance transmit data * in its Data_Request buffer. * * Formal Parameters * identifier (i) - Identifier to poll * data_to_transmit (i) - This is a mask that tells us to send Control * data, User data, or both. Since the * Multiplexer does not differentiate between * data types it transmits any data it has * pending_data (o) - Return value to indicat which data is left * to be transmitted. * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * * Side Effects * None * * Caveats * None * */ /* * ProtocolLayerError ProtocolLayer::PollReceiver ( * USHORT identifier); * * Functional Description * This function is called to give the layer a chance pass packets * to higher layers * * Formal Parameters * identifier (i) - Not used * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * * Side Effects * None * * Caveats * None * */ /* * ProtocolLayerError ProtocolLayer::GetParameters ( * USHORT identifier, * USHORT * max_packet_size); * * Functional Description * This function is called to get the maximum packet size * * Formal Parameters * identifier (i) - Not used * max_packet_size (o) - Returns the maximum packet size * * Return Value * PROTOCOL_LAYER_NO_ERROR - No error occured * * Side Effects * None * * Caveats * None * */ /* * BOOL ProtocolLayer::PerformAutomaticDisconnect ( * void) * * Public * * Functional Description: * This function can be used to avoid taking down DLCI0 when the number * of logical connections handled by a particular stack goes to zero. * This is a temporary fix that will probably change when the physical * connection buildup process is handled out of band. * * Formal Parameters * none * * Return Value * TRUE - The base class always returns TRUE. This is the default way * for a physical connection layer to work. * * Side Effects * None * * Caveats * None */ /* * PChar ProtocolLayer::GetIdentifier ( * void) * * Public * * Functional Description: * This function returns the identifier for the protocol layer. If the * layer does not override this call a NULL pointer will be returned. * * Formal Parameters * none * * Return Value * A pointer to the identifier of the protocol layer. * * Side Effects * None * * Caveats * None */