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