windows-nt/Source/XPSP1/NT/enduser/netmeeting/t120/mst123/scf.h

596 lines
18 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/* SCF.h
*
* Copyright (c) 1994-1995 by DataBeam Corporation, Lexington, KY
*
* Abstract:
* This class represents the Network layer in the T.123 Transport stack.
* This layer communicates over the DataLink layer (DLCI 0). It sends the
* necessary packets to start a connection. It is also responsible for
* disconnecting the connection.
*
* During arbitration of a connection, SCF arbitrates priority and DataLink
* parameters. SCF instantiates a SCFCall object for each active logical
* connection. Remotely initiated calls are placed in the
* Remote_Call_Reference array while locally initiated calls are kept in
* the Call_Reference array.
*
* This class inherits from ProtocolLayer although it assumes that it does
* not have a higher layer to pass packets to. The T.123 document is clear
* about that during the user data transmission, this layer has no purpose.
*
* Caveats:
* None.
*
* Authors:
* James W. Lawwill
*/
#ifndef _SCF_H_
#define _SCF_H_
#include "q922.h"
#include "scfcall.h"
/*
** SCF Errors
*/
typedef enum
{
SCF_NO_ERROR,
SCF_NO_SUCH_DLCI,
SCF_CONNECTION_FULL,
SCF_MEMORY_ALLOCATION_ERROR
}
SCFError;
#define TRANSPORT_HASHING_BUCKETS 3
/*
** Offsets into packet
*/
#define PROTOCOL_DISCRIMINATOR 0
#define LENGTH_CALL_REFERENCE 1
#define CALL_REFERENCE_VALUE 2
/*
** Supported commands
*/
#define NO_PACKET 0x00
#define CONNECT 0x07
#define CONNECT_ACKNOWLEDGE 0x0f
#define SETUP 0x05
#define RELEASE_COMPLETE 0x5a
/*
** Unsupported commands as stated by T.123
*/
#define RELEASE 0x4d
#define ALERTING 0x01
#define CALL_PROCEEDING 0x02
#define PROGRESS 0x03
#define DISCONNECT 0x45
#define SEGMENT 0x40
#define STATUS 0x5d
#define STATUS_ENQUIRY 0x55
/*
** Packet Elements, not all of these are supported.
*/
#define BEARER_CAPABILITY 0x04
#define DLCI_ELEMENT 0x19
#define END_TO_END_DELAY 0x42
#define LINK_LAYER_CORE_PARAMETERS 0x48
#define LINK_LAYER_PROTOCOL_PARAMETERS 0x49
#define X213_PRIORITY 0x50
#define CALLING_PARTY_SUBADDRESS 0x6d
#define CALLED_PARTY_SUBADDRESS 0x71
#define CAUSE 0x08
#define EXTENSION 0x80
/*
** Remote Call Reference
*/
#define REMOTE_CALL_REFERENCE 0x80
/*
** Bearer Capability definitions
*/
#define CODING_STANDARD 0
#define INFORMATION_TRANSFER_CAPABILITY 0x08
#define TRANSFER_MODE 0x20
#define LAYER_2_IDENT 0x40
#define USER_INFORMATION_LAYER_2 0x0e
/*
** DLCI element
*/
#define PREFERRED_EXCLUSIVE 0x40
/*
** Link Layer Core Parameters
*/
#define FMIF_SIZE 0x09
#define THROUGHPUT 0x0a
#define MINIMUM_THROUGHPUT 0x0b
#define COMMITTED_BURST_SIZE 0x0d
#define EXCESS_BURST_SIZE 0x0e
/*
** Link Layer Protocol Parameters
*/
#define TRANSMIT_WINDOW_SIZE_IDENTIFIER 0x07
#define RETRANSMISSION_TIMER_IDENTIFIER 0x09
/*
** Q.850 Error messages, these are the only 2 errors we currently support
*/
#define REQUESTED_CHANNEL_UNAVAILABLE 0x2c
#define NORMAL_USER_DISCONNECT 0x1f
/*
** Single Octet information elements
*/
#define SINGLE_OCTET_ELEMENT_MASK 0x80
#define Q931_PROTOCOL_DISCRIMINATOR 0x08
#define CALL_REFERENCE_ORIGINATOR 0x80
#define CALL_ORIGINATOR_MASK 0x7f
/*
** T303 is the timeout allowed from the time we send the SETUP until we receive
** a response
*/
#define DEFAULT_T303_TIMEOUT 30000
/*
** T313 is the timeout allowed from the time we send the CONNECT until we
** receive a response
*/
#define DEFAULT_T313_TIMEOUT 30000
class CLayerSCF : public IProtocolLayer
{
public:
CLayerSCF(
T123 *owner_object,
CLayerQ922 *lower_layer,
USHORT message_base,
USHORT identifier,
BOOL link_originator,
PDataLinkParameters datalink,
PMemoryManager memory_manager,
BOOL * initialized);
virtual ~CLayerSCF(void);
SCFError ConnectRequest (
DLCI dlci,
TransportPriority priority);
SCFError DisconnectRequest (
DLCI dlci);
SCFError ConnectResponse (
CallReference call_reference,
DLCI dlci,
BOOL valid_dlci);
/*
** Functions overridden from the ProtocolLayer object
*/
ProtocolLayerError DataRequest (
ULONG_PTR identifier,
LPBYTE buffer_address,
ULONG length,
PULong bytes_accepted);
ProtocolLayerError DataRequest (
ULONG_PTR identifier,
PMemory memory,
PULong bytes_accepted);
ProtocolLayerError DataIndication (
LPBYTE buffer_address,
ULONG length,
PULong bytes_accepted);
ProtocolLayerError RegisterHigherLayer (
ULONG_PTR identifier,
PMemoryManager dr_memory_manager,
IProtocolLayer * higher_layer);
ProtocolLayerError RemoveHigherLayer (
ULONG_PTR identifier);
ProtocolLayerError PollTransmitter (
ULONG_PTR identifier,
USHORT data_to_transmit,
USHORT * pending_data,
USHORT * holding_data);
ProtocolLayerError PollReceiver(void);
ProtocolLayerError GetParameters (
USHORT * max_packet_size,
USHORT * prepend,
USHORT * append);
ULONG OwnerCallback(ULONG, void *p1 = NULL, void *p2 = NULL, void *p3 = NULL);
private:
CallReference GetNextCallReference (void);
void ProcessMessages (void);
private:
DictionaryClass Remote_Call_Reference;
DictionaryClass Call_Reference;
DictionaryClass DLCI_List;
SListClass Message_List;
T123 *m_pT123; // owner object
CLayerQ922 *m_pQ922; // lower layer
USHORT m_nMsgBase;
USHORT Identifier;
USHORT Link_Originator;
USHORT Maximum_Packet_Size;
DataLinkParameters DataLink_Struct;
PMemoryManager Data_Request_Memory_Manager;
USHORT Lower_Layer_Prepend;
USHORT Lower_Layer_Append;
USHORT Call_Reference_Base;
};
typedef CLayerSCF * PSCF;
#endif
/*
* Documentation for Public class members
*/
/*
* CLayerSCF::CLayerSCF (
* PTransportResources transport_resources,
* IObject * owner_object,
* IProtocolLayer * lower_layer,
* USHORT message_base,
* USHORT identifier,
* BOOL link_originator,
* PChar config_file,
* PDataLinkParameters datalink,
* PMemoryManager memory_manager,
* BOOL * initialized);
*
* Functional Description
* This is the constructor for the SCF Network layer. It registers itself
* with the lower so that incoming data will be received properly.
*
* Formal Parameters
* transport_resources (i) - Pointer to TransportResources structure.
* owner_object (i) - Address of the object that owns this object
* lower_layer (i) - Address of the layer below us.
* message_base (i) - Message base used in owner callbacks.
* identifier (i) - This objects identification number. Passed to
* lower layer to identify us (DLCI 0).
* link_originator (i) - BOOL, TRUE if we started the link
* config_file (i) - Address of the configuration path string
* datalink (i) - Address structure holding the DataLink
* arbitratable parameters.
* memory_manager (i) - Address of the memory manager
* initialized (o) - Address of BOOL, we set it to TRUE if it
* worked
*
* Return Value
* None
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* CLayerSCF::~CLayerSCF (void);
*
* Functional Description
* This is the destructor for the SCF Network layer. We do our
* cleanup in here
*
* Formal Parameters
* None
*
* Return Value
* None
*
* Side Effects
* None
*
* Caveats
* None
*/
/*
* SCFError CLayerSCF::ConnectRequest (
* DLCI dlci,
* USHORT priority)
*
* Functional Description
* This function initiates a connection with the remote site. As a result,
* we will create a SCFCall and tell it to initiate a connection.
*
* Formal Parameters
* dlci (i) - Proposed DLCI for the connection
* priority (i) - Proposed priority for the connection
*
* Return Value
* SCF_NO_ERROR - No erroro occured
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* SCFError CLayerSCF::DisconnectRequest (
* DLCI dlci);
*
* Functional Description
* This function starts the disconnect process.
*
* Formal Parameters
* dlci (i) - DLCI to disconnect.
*
* Return Value
* SCF_NO_ERROR - No error occured
* SCF_NO_SUCH_DLCI - Invalid DLCI
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* SCFError CLayerSCF::ConnectResponse (
* CallReference call_reference,
* DLCI dlci,
* BOOL valid_dlci);
*
* Functional Description
* This function is called by a higher layer to confirm a connection. If
* the remote site initiates a connection with us, we issue a
* NETWORK_CONNECT_INDICATION to the owner object. It responds with this
* call to confirm or deny the suggested dlci.
*
* Formal Parameters
* call_reference (i) - Call reference ID, passed to owner in
* NETWORK_CONNECT_INDICATION
* dlci (i) - Referenced DLCI
* valid_dlci (i) - TRUE if the requested DLCI is valid
*
* Return Value
* SCF_NO_ERROR - No error occured
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError CLayerSCF::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. For the SCF, this functio is not used
*
* 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_ERROR
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError CLayerSCF::DataRequest (
* ULONG,
* PMemory,
* USHORT *)
*
* Functional Description
* This function is not used.
*
* Formal Parameters
* No parameters used
*
* Return Value
* PROTOCOL_LAYER_ERROR
*
* 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 CLayerSCF::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. This is a NULL function by SCF
*
* 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 higher layer allowed
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError CLayerSCF::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. This is a NULL function for SCF
*
* Formal Parameters
* identifier (i) - Identifier used to identify the higher layer
*
* Return Value
* PROTOCOL_LAYER_REGISTRATION_ERROR - No higher layer allowed
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError CLayerSCF::PollTransmitter (
* ULONG identifier,
* USHORT data_to_transmit,
* USHORT * pending_data,
* USHORT * holding_data);
*
* Functional Description
* This function is called to give SCF 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
* SCF 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 CLayerSCF::PollReceiver (
* ULONG identifier);
*
* Functional Description
* This function is called to give SCF a chance pass packets
* to higher layers. It is not used in SCF.
*
* Formal Parameters
* identifier (i) - Not used
*
* Return Value
* PROTOCOL_LAYER_NO_ERROR - No error occured
*
* Side Effects
* None
*
* Caveats
* None
*
*/
/*
* ProtocolLayerError CLayerSCF::GetParameters (
* ULONG identifier,
* USHORT * max_packet_size,
* USHORT * prepend,
* USHORT * append);
*
* Functional Description
* This function is called to get the maximum packet size. This function
* is not used in SCF. It is here because we inherit from ProtocolLayer
* and this is a pure virtual function in that class.
*
* Formal Parameters
* identifier (i) - Not used
* max_packet_size (o) - Returns the maximum packet size
* prepend (o) - Number of bytes prepended to a packet
* append (o) - Number of bytes appended to a packet
*
* Return Value
* PROTOCOL_LAYER_REGISTRATION_ERROR - Function can not be called
*
* Side Effects
* None
*
* Caveats
* None
*
*/