windows-nt/Source/XPSP1/NT/net/irda/irlmp/irlmpp.h
2020-09-26 16:20:57 +08:00

243 lines
8.1 KiB
C

/*****************************************************************************
*
* Copyright (c) 1995 Microsoft Corporation
*
* File: irlmp.h
*
* Description: IRLMP Protocol and control block definitions
*
* Author: mbert
*
* Date: 6/12/95
*
*/
#define IRLMP_MAX_TX_MSG_LIST_LEN 8
#define LSAP_RESPONSE_TIMEOUT 7000
// This is the time that:
// (1) the IRLMP client has to respond to an IRLMP_CONNECT_IND, or
// (2) the peer LSAP has to respond to an IRLMP LM-Connect request PDU, or
// (3) the peer LSAP has to respond to an LM-Access request PDU
// On expiration:
// (1) send peer LSAP an IRLMP LM-Disconnect indication PDU. Or
// (2) notify IRLMP client with a IRLMP_DISCONNECT_IND
// (3) notify IRLMP client with a IRLMP_ACCESSMODE_CONF
#define IRLMP_DISCONNECT_DELAY_TIMEOUT 2000
// When the final LSAP-LSAP connection is terminated, wait before
// disconnecting link in case another LSAP connection is made.
// This is primarily used when the remote connects to the IAS
// and then disconnects followed by a new LSAP connection.
#define IRLMP_NOT_SEEN_THRESHOLD 3 // The number of times that a device
// is not seen in a discovery before
// it is removed from the aged list
// maintained by IRLMP
typedef struct IAS_Attribute
{
struct IAS_Attribute *pNext;
CHAR *pAttribName;
void *pAttribVal;
int AttribValLen;
int CharSet;
UCHAR AttribValType;
} IAS_ATTRIBUTE, *PIAS_ATTRIBUTE;
typedef struct IAS_Object
{
LIST_ENTRY Linkage;
CHAR *pClassName;
IAS_ATTRIBUTE *pAttributes;
UINT ObjectId;
} IAS_OBJECT, *PIAS_OBJECT;
typedef struct
{
LIST_ENTRY Linkage;
int Lsap;
UINT Flags; // see IRLMP_LSAP_CB.Flags
} IRLMP_REGISTERED_LSAP, *PIRLMP_REGISTERED_LSAP;
// IRLMP Control Block
typedef enum
{
LSAP_CREATED,
LSAP_DISCONNECTED,
LSAP_IRLAP_CONN_PEND, // waiting for IRLAP_CONNECT_CONF from IRLAP
LSAP_LMCONN_CONF_PEND, // waiting for IRLMP Conn conf PDU from peer
LSAP_CONN_RESP_PEND, // waiting for IRLMP_CONNECT_RESP from client
LSAP_CONN_REQ_PEND, // Got IRLMP_CONNECT_REQ when link is either
// in discovery or disconnecting
LSAP_EXCLUSIVEMODE_PEND, // Pending response from peer
LSAP_MULTIPLEXEDMODE_PEND, // Pending response from peer
LSAP_READY, // CONNECTED STATES SHOULD ALWAYS FOLLOW THIS
LSAP_NO_TX_CREDIT // IRLMP_DATA_REQ with no transmit credit
} IRLMP_LSAP_STATE;
typedef enum
{
LINK_DOWN,
LINK_DISCONNECTED,
LINK_DISCONNECTING, // Sent IRLAP_DISCONNECT_REQ, waiting for IND
LINK_IN_DISCOVERY, // Sent IRLAP_DISCOVERY_REQ, waiting for CONF
LINK_CONNECTING, // Sent IRLAP_CONNECT_REQ, waiting for CONF
LINK_READY // Received CONF
} IRLMP_LINK_STATE;
#define LSAPSIG 0xEEEEAAAA
#define VALIDLSAP(l) ASSERT(l->Sig == LSAPSIG)
typedef struct
{
LIST_ENTRY Linkage;
struct IrlmpLinkCb *pIrlmpCb;
IRLMP_LSAP_STATE State;
#ifdef DBG
int Sig;
#endif
int UserDataLen;
int LocalLsapSel;
int RemoteLsapSel;
int AvailableCredit; // additional credit that
// can be advanced to remote
int LocalTxCredit; // credit for transmitting
int RemoteTxCredit; // what remote has for txing
LIST_ENTRY TxMsgList; // messages from client waiting
// for ack
LIST_ENTRY SegTxMsgList; // above messages that have been
// segmented, but not sent because
// there is no credit available
int TxMaxSDUSize;
int RxMaxSDUSize;
IRLMP_DISC_REASON DiscReason;
IRDA_TIMER ResponseTimer;
PVOID TdiContext;
REF_CNT RefCnt;
UINT Flags;
#define LCBF_USE_TTP 1
#define LCBF_TDI_OPEN 2
UCHAR UserData[IRLMP_MAX_USER_DATA_LEN];
} IRLMP_LSAP_CB, *PIRLMP_LSAP_CB;
typedef struct IrlmpLinkCb
{
LIST_ENTRY LsapCbList;
PIRDA_LINK_CB pIrdaLinkCb;
IRLMP_LINK_STATE LinkState;
UCHAR ConnDevAddr[IRDA_DEV_ADDR_LEN];
IRDA_QOS_PARMS RequestedQOS;
IRDA_QOS_PARMS NegotiatedQOS;
int MaxSlot;
int MaxPDUSize;
int WindowSize;
IRDA_TIMER DiscDelayTimer;
IRLMP_LSAP_CB *pExclLsapCb; // pointer to LSAP_CB that has
// link in exclusive mode
IAS_QUERY *pIasQuery;
UINT AttribLen;
UINT AttribLenWritten;
int QueryListLen;
UCHAR IasQueryDevAddr[IRDA_DEV_ADDR_LEN];
int IasRetryCnt;
PVOID hAttribDeviceName;
PVOID hAttribIrlmpSupport;
LIST_ENTRY DeviceList;
UINT DiscoveryFlags;
#define DF_NORMAL_DSCV 1
#define DF_NO_SENSE_DSCV 2
BOOLEAN ConnDevAddrSet;
BOOLEAN ConnReqScheduled;
BOOLEAN FirstIasRespReceived;
BOOLEAN AcceptConnection;
} IRLMP_LINK_CB, *PIRLMP_LINK_CB;
// IRLMP-PDU types (CntlBit)
#define IRLMP_CNTL_PDU 1
#define IRLMP_DATA_PDU 0
typedef struct
{
UCHAR DstLsapSel:7;
UCHAR CntlBit:1;
UCHAR SrcLsapSel:7;
UCHAR RsvrdBit:1;
} IRLMP_HEADER;
// Control IRLMP-PDU types (OpCode)
#define IRLMP_CONNECT_PDU 1
#define IRLMP_DISCONNECT_PDU 2
#define IRLMP_ACCESSMODE_PDU 3
// A Bit
#define IRLMP_ABIT_REQUEST 0
#define IRLMP_ABIT_CONFIRM 1
// Status
#define IRLMP_RSVD_PARM 0x00
#define IRLMP_STATUS_SUCCESS 0x00
#define IRLMP_STATUS_FAILURE 0x01
#define IRLMP_STATUS_UNSUPPORTED 0xFF
typedef struct
{
UCHAR OpCode:7;
UCHAR ABit:1;
UCHAR Parm1;
UCHAR Parm2;
} IRLMP_CNTL_FORMAT;
// Tiny TP!
#define TTP_PFLAG_NO_PARMS 0
#define TTP_PFLAG_PARMS 1
#define TTP_MBIT_NOT_FINAL 1
#define TTP_MBIT_FINAL 0
typedef struct
{
UCHAR InitialCredit:7;
UCHAR ParmFlag:1;
} TTP_CONN_HEADER;
typedef struct
{
UCHAR AdditionalCredit:7;
UCHAR MoreBit:1;
} TTP_DATA_HEADER;
#define TTP_MAX_SDU_SIZE_PI 1
#define TTP_MAX_SDU_SIZE_PL 4 // I'm hardcoding this. Seems unecessary
// to make it variable. I will handle
// receiving varialbe sized however
typedef struct
{
UCHAR PLen;
UCHAR PI;
UCHAR PL;
UCHAR PV[TTP_MAX_SDU_SIZE_PL];
} TTP_CONN_PARM;
// IAS
#define IAS_SUCCESS 0
#define IAS_NO_SUCH_OBJECT 1
#define IAS_NO_SUCH_ATTRIB 2
#define IAS_MSGBUF_LEN 50
#define IAS_LSAP_SEL 0
#define IAS_LOCAL_LSAP_SEL 3
#define IAS_IRLMP_VERSION 1
#define IAS_SUPPORT_BIT_FIELD 0 // No other IAS support
#define IAS_LMMUX_SUPPORT_BIT_FIELD 1 // Exclusive mode only
typedef struct
{
UCHAR OpCode:6;
UCHAR Ack:1;
UCHAR Last:1;
} IAS_CONTROL_FIELD;