windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/t120/mst120/tprtctrl.h
2020-09-26 16:20:57 +08:00

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