Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

413 lines
13 KiB

/* 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
*/