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
17 KiB
496 lines
17 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
|
|
*
|
|
*/
|
|
|