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