243 lines
8.1 KiB
C
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;
|
||
|
|