596 lines
18 KiB
C++
596 lines
18 KiB
C++
/* 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
|
||
*
|
||
*/
|
||
|