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.
 
 
 
 
 
 

496 lines
16 KiB

/* Mplex.h
*
* Copyright (c) 1994-1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This is the multiplexer class. It inherits from the ProtocolLayer
* class which means it is one of the layers in a Transport stack. This
* class has these capabilities:
*
* 1. It takes stream data from the lower layer and packetizes it.
* If the lower layer gives us data in a stream format, we run it
* through a packet framer to build up a packet. This class uses
* a framer object passed in by the constructor. When data is
* received from the lower layer, the data is given to the framer
* object. The framer notifies us of a complete packet. The
* framer could be any type of framer (i.e RFC1006, flagged data
* with bit or byte stuffing, ...). If no framer is passed in by
* the constructor, we assume that the data is being received in
* packets.
*
* A packet received from the higher layer is run through the
* framer to encode the data. It is then fed to the lower layer
* in a stream fashion.
*
* 2. It multiplexes multiple higher layers. It currently assumes the
* incoming packets are in Q.922 packet format. Each higher layer
* is identified by its DLCI. This class is capable of looking at
* the packet and determining the DLCI and thus where to route it.
*
* Since this is a multiplexer, we receive packets for many
* different stacks and we do not buffer them if the higher layer
* is not ready for them. If it attempts to send the packet to the
* higher layer and it does not accept it, it may trash it. This
* must be done in order to maintain the other transport
* connections. If necessary, in the future, we could buffer
* packets at this layer.
*
* 3. This class receives a CRC object during construction (if it is
* NULL, no CRC is necessary). The object runs a packet thru the
* CRC generator and attaches it to the end of the packet. On the
* reception of a packet from a lower layer, we check the CRC for
* validity.
*
* Caveats:
* 1. If a framer exists, it assumes the packet is in Q.922 format
* 2. This class is currently Q.922 oriented as far as finding the
* packet identifier (DLCI). This will be fixed in the future.
*
* Authors:
* James W. Lawwill
*/
#ifndef _MULTIPLEXER_H_
#define _MULTIPLEXER_H_
#include "q922.h"
#define MULTIPLEXER_MAXIMUM_PACKET_SIZE 1024
#define TRANSPORT_HASHING_BUCKETS 3
/*
** If the identifier (DLCI) contained by the packet is not legal, the following
** identifier is returned
*/
#define ILLEGAL_DLCI 0xffff
/*
** Multiplexer return codes
*/
typedef enum
{
MULTIPLEXER_NO_ERROR
}
MultiplexerError;
typedef struct
{
IProtocolLayer *q922;
PMemoryManager data_request_memory_manager;
}
MPlexStruct, * PMPlexStruct;
class Multiplexer : public IProtocolLayer
{
public:
Multiplexer(T123 *owner_object,
ComPort *lower_layer,
PhysicalHandle lower_layer_identifier,
USHORT message_base,
PPacketFrame framer,
PCRC crc,
BOOL *initialized);
virtual ~Multiplexer(void);
MultiplexerError ConnectRequest (void);
MultiplexerError DisconnectRequest (void);
/*
** Functions overridden from the ProtocolLayer object
*/
ProtocolLayerError DataRequest (
ULONG_PTR dlci,
LPBYTE buffer_address,
ULONG length,
PULong bytes_accepted);
ProtocolLayerError DataRequest (
ULONG_PTR dlci,
PMemory memory,
PULong bytes_accepted);
ProtocolLayerError DataIndication (
LPBYTE buffer_address,
ULONG length,
PULong bytes_accepted);
ProtocolLayerError RegisterHigherLayer (
ULONG_PTR dlci,
PMemoryManager memory_manager,
IProtocolLayer * higher_layer);
ProtocolLayerError RemoveHigherLayer (
ULONG_PTR dlci);
ProtocolLayerError PollTransmitter (
ULONG_PTR dlci,
USHORT data_to_transmit,
USHORT * pending_data,
USHORT * holding_data);
ProtocolLayerError PollReceiver(void);
ProtocolLayerError GetParameters (
USHORT * max_packet_size,
USHORT * prepend_bytes,
USHORT * append_bytes);
private:
void SendDataToHigherLayer (
LPBYTE buffer_address,
USHORT buffer_length);
DLCI GetDLCI (
LPBYTE buffer_address,
USHORT buffer_size);
private:
DictionaryClass Q922_Layers;
T123 *m_pT123; // owner object
ComPort *m_pComPort; // lower layer
PhysicalHandle m_hCommLink; // physical handle
USHORT m_nMsgBase;
USHORT Maximum_Packet_Size;
USHORT Packet_Size;
LPBYTE Data_Request_Buffer;
PMemory Data_Request_Memory_Object;
DLCI Data_Request_DLCI;
USHORT Data_Request_Length;
USHORT Data_Request_Offset;
LPBYTE Data_Indication_Buffer;
USHORT Data_Indication_Length;
BOOL Data_Indication_Ready;
PPacketFrame Framer;
PCRC CRC;
USHORT CRC_Size;
BOOL Decode_In_Progress;
BOOL Disconnect;
};
#endif
/*
* Documentation for Public class members
*/
/*
* Multiplexer::Multiplexer (
* IObject * object_owner,
* IProtocolLayer * lower_layer,
* ULONG identifier,
* USHORT message_base,
* PPacketFrame framer,
* PCRC crc,
* BOOL * initialized);
*
* Functional Description
* This is the constructor for the Multiplexer layer
*
* Formal Parameters
* object_owner - (i) Address of owner object.
* lower_layer - (i) Address of the layer below the multiplexer
* identifier - (i) A lower layer identifier that is passed to the
* lower layer with each call to it. The
* identifier tells the lower layer which "channel"
* to use.
* message_base - (i) Message identifier that is passed back to the
* owner object during a callback
* framer - (i) Address of a framer object
* crc - (i) Address of a crc object
* initialized - (o) Set to TRUE if the multiplexer initialized OK
*
* Return Value
* None
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* Multiplexer::~Multiplexer (void)
*
* Functional Description
* This is the destructor for the Multiplexer layer. It removes itself
* from the lower layer and frees all buffers and filters (i.e. framer)
*
* Formal Parameters
* None
*
* Return Value
* None
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* MultiplexerError Multiplexer::ConnectRequest (void);
*
* Functional Description
* This function issues an immediate NEW_CONNECTION message to the owner
* of this object. If this was a more sophisticated layer, it would
* communicate with the remote multiplexer layer to establish itself.
*
* Formal Parameters
* None
*
* Return Value
* None
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* MultiplexerError Multiplexer::DisconnectRequest (void);
*
* Functional Description
* This function removes its connection with the lower layer and does
* a BROKEN_CONNECTION callback to the owner object
*
* Formal Parameters
* None
*
* Return Value
* None
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError Multiplexer::DataRequest (
* ULONG identifier,
* LPBYTE buffer_address,
* USHORT length,
* USHORT * bytes_accepted);
*
* Functional Description
* This function is called by a higher layer to request transmission of
* a packet.
*
* Formal Parameters
* identifier (i) - Identifier of the higher layer
* buffer_address (i) - Buffer address
* length (i) - Length of packet to transmit
* bytes_accepted (o) - Number of bytes accepted by the Multiplexer.
* This value will either be 0 or the packet
* length since this layer is a packet to byte
* converter.
*
* Return Value
* PROTOCOL_LAYER_NO_ERROR - No error occured
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError Multiplexer::DataRequest (
* ULONG identifier,
* PMemory memory,
* PULong bytes_accepted);
*
* Functional Description
* This function is called by a higher layer to request transmission of
* a packet.
*
* Formal Parameters
* identifier (i) - Identifier of the higher layer
* memory (o) - Pointer to memory object holding the packet
* bytes_accepted (o) - Number of bytes accepted by the Multiplexer.
* This value will either be 0 or the packet
* length since this layer is a packet to byte
* converter.
*
* Return Value
* PROTOCOL_LAYER_NO_ERROR - No error occured
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError Multiplexer::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 Multiplexer::RegisterHigherLayer (
* ULONG 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. If this multiplexer is being used as a stream to packet
* converter only, the identifer is not used and all data is passed to the
* higher layer.
*
* 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 Multiplexer::RemoveHigherLayer (
* ULONG 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 Multiplexer::PollTransmitter (
* ULONG identifier,
* USHORT data_to_transmit,
* USHORT * pending_data);
*
* Functional Description
* This function is called to give the Multiplexer a chance transmit data
* in its Data_Request buffer.
*
* Formal Parameters
* identifier (i) - Not used
* 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 Multiplexer::PollReceiver (
* ULONG identifier);
*
* Functional Description
* This function is called to give the Multiplexer 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 Multiplexer::GetParameters (
* ULONG identifier,
* USHORT * max_packet_size,
* USHORT * prepend_bytes,
* USHORT * append_bytes);
*
* 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
* prepend_bytes (o) - Returns the Number of bytes prepended by
* this layer
* append_bytes (o) - Returns the Number of bytes appended by
* this layer
*
* Return Value
* PROTOCOL_LAYER_NO_ERROR - No error occured
*
* Side Effects
* None
*
* Caveats
* None
*
*/