208 lines
7.6 KiB
C
208 lines
7.6 KiB
C
/* Tprtctrl.h
|
|
*
|
|
* Copyright (c) 1996 by Microsoft Corporation
|
|
*
|
|
* Abstract:
|
|
* This is the transport for Winsock over TCP.
|
|
*
|
|
* This module controls making and breaking socket connections. When the
|
|
* transport creates or detects a connection, Transprt.cpp is notified.
|
|
* It then instantiates a connection object which tracks the socket until
|
|
* it is destroyed. The TCP stack notifies Transprt.cpp when a socket
|
|
* connection is up and running. It also notifies us if the link is broken
|
|
* for some reason. As a result, the Tprtctrl module will notify the user
|
|
* of new or broken connections.
|
|
*
|
|
* When the user wants to make a data request of a specific transport
|
|
* connection, this module maps the connection id to a socket number. The
|
|
* data request is passed on to TCP. Data Indications are passed
|
|
* to the user by ReadRequest().
|
|
*
|
|
* USER CALLBACKS:
|
|
* The user communicates with this DLL by making calls directly to the
|
|
* DLL. The DLL communicates with the user by issuing callbacks.
|
|
* The TInitialize() call accepts as a parameter, a callback address and
|
|
* a user defined variable. When a significant event occurs in the DLL,
|
|
* the DLL will jump to the callback address. The first parameter of
|
|
* the callback is the message. This could be a CONNECT_INDICATION,
|
|
* DISCONNECT_INDICATION, or any number of significant events. The
|
|
* second parameter is a message specific parameter. The third
|
|
* parameter is the user defined variable that was passed in during
|
|
* the TInitialize() function. See the MCATTPRT.h interface file
|
|
* for a complete description of the callback messages.
|
|
*
|
|
* MAKING A CALL:
|
|
* After the initialization has been done, the user will eventually,
|
|
* want to attempt a connection. The user issues a TConnectRequest() call
|
|
* with the IP address of the remote location. The connection request
|
|
* is passed on to the Winsock layer. It eventually issues FD_CONNECT to
|
|
* our window to say that the connection was successful.
|
|
*
|
|
* RECEIVING A CALL:
|
|
* If we receive a call from a remote location, Winsock notifies
|
|
* us with FD_ACCEPT. We then create a new connection object
|
|
* associated with the new socket.
|
|
*
|
|
* SENDING PACKETS:
|
|
* To send data to the remote location, use the DataRequest() function
|
|
* call. This module will pass the packet to the socket that it is
|
|
* associated with. The send may actually occur after the call has
|
|
* returned to the user.
|
|
*
|
|
* RECEIVING PACKETS:
|
|
* The user receives packets by DATA_INDICATION callbacks. When Winsock
|
|
* notifies us with a FD_READ, we issue a recv() to receive any new
|
|
* packets. If a packet is complete, we issue a DATA_INDICATION
|
|
* callback to the user with the socket handle, the address
|
|
* of the packet, and the packet length.
|
|
*
|
|
* DISCONNECTING A TRANSPORT:
|
|
* To disconnect a transport connection, use the DisconnectRequest()
|
|
* function. After the link has been brought down, we perform a
|
|
* callback to the user to verify the disconnect.
|
|
*
|
|
*/
|
|
#ifndef _TRANSPORT_CONTROLLER_
|
|
#define _TRANSPORT_CONTROLLER_
|
|
|
|
/* Header for a RFC1006 packet */
|
|
typedef struct _rfc_tag
|
|
{
|
|
UChar Version; /* Should be RFC1006_VERSION_NUMBER (3) */
|
|
UChar Reserved; /* Must be 0x00 */
|
|
UChar msbPacketSize; /* msb of packet size, including RFC header */
|
|
UChar lsbPacketSize; /* lsb of packet size, including RFC header */
|
|
} RFC_HEADER;
|
|
|
|
/* Header for X224 data packet */
|
|
typedef struct _data_packet_tag
|
|
{
|
|
RFC_HEADER rfc; /* RFC1006 packet header */
|
|
UChar HeaderSize; /* Must be 0x02, for data packets */
|
|
UChar PacketType; /* Must be DATA_PACKET, for data packets */
|
|
UChar FinalPacket; /* EOT_BIT or 0 */
|
|
} X224_DATA_PACKET;
|
|
|
|
#include "socket.h"
|
|
|
|
/* Connection Info (used for both CONNECTION_REQUEST and CONNECTION_CONFIRM) */
|
|
typedef struct _connect_common_tag
|
|
{
|
|
UChar PacketType; /* CONNECTION_REQUEST_PACKET or CONFIRM_PACKET */
|
|
UChar msbDest; /* msb of destination-side (answering) socket id */
|
|
UChar lsbDest; /* lsb of destination-side (answering) socket id */
|
|
UChar msbSrc; /* msb of source-side (initiating) socket id */
|
|
UChar lsbSrc; /* lsb of source-side (initiating) socket id */
|
|
UChar DataClass; /* Must be 0x00 */
|
|
} X224_CONNECT_COMMON;
|
|
|
|
/* Transport variable field info type and size. */
|
|
typedef struct _t_variable_field_info
|
|
{
|
|
UChar InfoType;
|
|
UChar InfoSize;
|
|
} X224_VARIABLE_INFO;
|
|
|
|
/* TPDU Arbitration Info (not used with CONNECTION_CONFIRM) */
|
|
typedef struct _tpdu_info_tag
|
|
{
|
|
UChar InfoType; /* Must be TPDU_SIZE (192) */
|
|
UChar InfoSize; /* Must be 1 */
|
|
UChar Info; /* Requested PDU Size (default: 10, or 1K bytes) */
|
|
} X224_TPDU_INFO;
|
|
|
|
/* Minimal Connection Request/Confirm packet */
|
|
typedef struct _connect_tag
|
|
{
|
|
RFC_HEADER rfc; /* RFC1006 packet header */
|
|
UChar HeaderSize;
|
|
X224_CONNECT_COMMON conn; /* Connection Info */
|
|
} X224_CONNECT;
|
|
|
|
typedef X224_CONNECT X224_CR_FIXED;
|
|
typedef X224_CONNECT X224_CC_FIXED;
|
|
|
|
typedef struct _disconnect_info_tag
|
|
{
|
|
UChar PacketType; /* Must be DISCONNECT_REQUEST_PACKET */
|
|
UChar msbDest;
|
|
UChar lsbDest;
|
|
UChar msbSrc;
|
|
UChar lsbSrc;
|
|
UChar reason; /* DR Reason Code */
|
|
} X224_DISCONN;
|
|
|
|
typedef struct _disconnect_request_fixed
|
|
{
|
|
RFC_HEADER rfc;
|
|
UChar HeaderSize;
|
|
X224_DISCONN disconn;
|
|
} X224_DR_FIXED;
|
|
|
|
#define X224_SIZE_OFFSET 2
|
|
|
|
#define UNK 0 // Used to initialize fields in static
|
|
// data structures that will be initialized
|
|
// later.
|
|
|
|
/* 2^DEFAULT_TPDU_SIZE is the default X224 packet size we request */
|
|
#define DEFAULT_TPDU_SIZE 13 /* 2^13 is 8K packet size */
|
|
#define LOWEST_TPDU_SIZE 7 /* 2^7 is 128 bytes */
|
|
#define HIGHEST_TPDU_SIZE 20 /* 2^20 is ... too big */
|
|
#define DEFAULT_MAX_X224_SIZE (1 << DEFAULT_TPDU_SIZE)
|
|
|
|
/* Function definitions */
|
|
TransportError ConnectRequest (TransportAddress transport_address, BOOL fSecure, PTransportConnection pXprtConn);
|
|
BOOL ConnectResponse (TransportConnection XprtConn);
|
|
void DisconnectRequest (TransportConnection XprtConn, ULONG ulNotify);
|
|
TransportError DataRequest ( TransportConnection XprtConn,
|
|
PSimplePacket packet);
|
|
void SendX224ConnectRequest (TransportConnection);
|
|
void EnableReceiver (Void);
|
|
void PurgeRequest (TransportConnection XprtConn);
|
|
void AcceptCall (TransportType);
|
|
void AcceptCall (TransportConnection);
|
|
void ReadRequest(TransportConnection);
|
|
void ReadRequestEx(TransportConnection);
|
|
TransportError FlushSendBuffer(PSocket pSocket, LPBYTE buffer, UINT length);
|
|
#ifdef TSTATUS_INDICATION
|
|
Void SendStatusMessage( PChar RemoteAddress,
|
|
TransportState state,
|
|
UInt message_id);
|
|
#endif
|
|
void QoSLock(Void);
|
|
void QoSUnlock(Void);
|
|
void ShutdownAndClose (TransportConnection, BOOL fShutdown, int how );
|
|
TransportError GetLocalAddress(TransportConnection XprtConn,
|
|
TransportAddress address,
|
|
int * size);
|
|
|
|
/* The TCP message window procedure (processes all Windows messages) */
|
|
LRESULT WindowProcedure (HWND, UINT, WPARAM, LPARAM);
|
|
|
|
/* RFC definitions */
|
|
#define RFC1006_VERSION_NUMBER 3
|
|
#define RFC1006_VERSION_SHIFTED_LEFT 0x03000000L /* Optimizes AddRFCHeader */
|
|
|
|
/* Packet types */
|
|
#define CONNECTION_REQUEST_PACKET 0xe0
|
|
#define CONNECTION_CONFIRM_PACKET 0xd0
|
|
#define DISCONNECT_REQUEST_PACKET 0x80
|
|
#define ERROR_PACKET 0x70
|
|
#define DATA_PACKET 0xf0
|
|
|
|
#define TPDU_SIZE 0xc0
|
|
#define T_SELECTOR 0xc1
|
|
#define T_SELECTOR_2 0xc2
|
|
/* X224 definitions */
|
|
#define EOT_BIT 0x80
|
|
|
|
/* Macro to fill-in RFC header at specified buffer location */
|
|
#define AddRFCSize(ptr, size) { \
|
|
ASSERT((size) < 65536L ); \
|
|
((LPBYTE) (ptr))[X224_SIZE_OFFSET] = (BYTE) ((size) >> 8); \
|
|
((LPBYTE) (ptr))[X224_SIZE_OFFSET + 1] = (BYTE) (size); }
|
|
|
|
#endif /* _TRANSPORT_CONTROLLER_ */
|
|
|