windows-nt/Source/XPSP1/NT/net/tapi/skywalker/h323/tsp/ras.h
2020-09-26 16:20:57 +08:00

270 lines
7 KiB
C++

#ifndef _RAS_H_
#define _RAS_H_
#define REG_RETRY_MAX 3
#define URQ_RETRY_MAX 2
#define ARQ_RETRY_MAX 3
#define DRQ_RETRY_MAX 3
#define RASIO_SEND_BUFFER_LIST_MAX 10
#define REG_EXPIRE_TIME 4000
#define ARQ_EXPIRE_TIME 4000
#define NOT_RESEND_SEQ_NUM -1
//(127.0.0.1 in network byte order)
#define NET_LOCAL_IP_ADDR_INTERFACE 0x0100007F
//(127.0.0.1 in host byte order)
#define HOST_LOCAL_IP_ADDR_INTERFACE 0x7F000001
extern const ASN1objectidentifier_s _OID_H225ProtocolIdentifierV1 [];
extern const ASN1objectidentifier_s _OID_H225ProtocolIdentifierV2 [];
#define OID_H225ProtocolIdentifierV1 const_cast<ASN1objectidentifier_s *> (_OID_H225ProtocolIdentifierV1);
#define OID_H225ProtocolIdentifierV2 const_cast<ASN1objectidentifier_s *> (_OID_H225ProtocolIdentifierV2);
#undef OID_ELEMENT
#define OID_RasProtocolIdentifierV2 (ASN1objectidentifier_s *)_OID_RasProtocolIdentifierV2
class RAS_CLIENT;
struct EXPIRE_CONTEXT
{
WORD seqNumber;
union
{
HDRVCALL DriverCallHandle;
RAS_CLIENT * RasClient;
};
};
typedef struct _ALIASCHANGE_REQUEST
{
LIST_ENTRY listEntry;
ENDPOINT_ID rasEndpointID;
WORD wRequestSeqNum;
PH323_ALIASNAMES pAliasList;
} ALIASCHANGE_REQUEST, *PALIASCHANGE_REQUEST;
#define REG_TTL_MARGIN 2
enum RAS_CLIENT_STATE
{
RAS_CLIENT_STATE_NONE = 0,
RAS_CLIENT_STATE_INITIALIZED
};
//If the app wants to send an URQ but the TSP ihasn't received RCF yet then we
//the information in this struct and send URQ when we get RCF.
typedef struct _PENDINGURQ
{
WORD RRQSeqNumber;
} PENDINGURQ;
enum RAS_REGISTER_STATE
{
RAS_REGISTER_STATE_IDLE = 0,
RAS_REGISTER_STATE_RRQSENT,
RAS_REGISTER_STATE_RRQEXPIRED,
RAS_REGISTER_STATE_REGISTERED,
RAS_REGISTER_STATE_URQSENT,
RAS_REGISTER_STATE_URQEXPIRED,
RAS_REGISTER_STATE_UNREGISTERED,
RAS_REGISTER_STATE_RRJ,
RAS_REGISTER_STATE_URQRECVD,
};
class RAS_CLIENT
{
private:
HANDLE m_hRegTimer;
HANDLE m_hUnRegTimer;
HANDLE m_hRegTTLTimer;
PH323_ALIASNAMES m_pAliasList;//list of all the aliases registered with this list
SOCKET m_Socket;
CRITICAL_SECTION m_CriticalSection;
RAS_REGISTER_STATE m_RegisterState;
DWORD m_IoRefCount;
RAS_CLIENT_STATE m_dwState;
LIST_ENTRY m_sendFreeList;
LIST_ENTRY m_sendPendingList;
DWORD m_dwSendFreeLen;
SOCKADDR_IN m_GKAddress;
SOCKADDR_IN m_sockAddr;
TransportAddress m_transportAddress;
RAS_RECV_CONTEXT m_recvOverlapped;
WORD m_lastRegisterSeqNum;
WORD m_wTTLSeqNumber;
WORD m_UnRegisterSeqNum;
WORD m_wRASSeqNum;
DWORD m_dwRegRetryCount;
DWORD m_dwUnRegRetryCount;
DWORD m_dwCallsInProgress;
ENDPOINT_ID m_RASEndpointID;
ASN1_CODER_INFO m_ASNCoderInfo;
PENDINGURQ m_PendingURQ;
DWORD m_dwRegTimeToLive;
EXPIRE_CONTEXT* m_pRRQExpireContext;
EXPIRE_CONTEXT* m_pURQExpireContext;
LIST_ENTRY m_aliasChangeRequestList;
RAS_SEND_CONTEXT *AllocSendBuffer();
void FreeSendBuffer( RAS_SEND_CONTEXT * pBuffer );
void OnInfoRequest( InfoRequest * IRQ );
void ProcessRasMessage(IN RasMessage *rasMessage );
void OnUnregistrationConfirm( IN UnregistrationConfirm *UCF );
void OnUnregistrationReject( IN UnregistrationReject *URJ );
void OnRegistrationReject( IN RegistrationReject * RRJ );
void OnRegistrationConfirm( IN RegistrationConfirm * RCF );
BOOL InitializeIo();
BOOL IssueRecv();
int TermASNCoder(void);
int InitASNCoder(void);
BOOL SendUCF( WORD seqNumber );
BOOL SendURJ( WORD seqNumber, DWORD dwReason );
void OnUnregistrationRequest( IN UnregistrationRequest *URQ );
BOOL FreeSendList( PLIST_ENTRY pListHead );
BOOL InitializeTTLTimer( IN RegistrationConfirm * RCF );
HRESULT SendInfoRequestResponse(
IN SOCKADDR_IN * RasAddress,
IN USHORT SequenceNumber,
IN InfoRequestResponse_perCallInfo * CallInfoList);
HRESULT EncodeSendMessage(
IN RasMessage * rasMessage );
public:
RAS_CLIENT();
~RAS_CLIENT();
void Lock()
{
H323DBG((DEBUG_LEVEL_TRACE, "wait on RAS client lock:%p.", this ));
EnterCriticalSection( &m_CriticalSection );
H323DBG((DEBUG_LEVEL_TRACE, "RAS client locked: %p.", this ));
}
void Unlock()
{
LeaveCriticalSection( &m_CriticalSection );
H323DBG((DEBUG_LEVEL_TRACE, "RAS client unlocked: %p.", this ));
}
WORD GetNextSeqNum()
{
WORD wSeqNum;
Lock();
wSeqNum = ++m_wRASSeqNum;
if( wSeqNum == 0 )
wSeqNum = ++m_wRASSeqNum;
Unlock();
return wSeqNum;
}
RAS_REGISTER_STATE GetRegState()
{
return m_RegisterState;
}
HRESULT GetEndpointID (
OUT ASN1char16string_t * ReturnEndpointID);
HRESULT GetLocalAddress (
OUT SOCKADDR_IN * ReturnSocketAddress)
{
HRESULT hr;
Lock();
if (m_RegisterState == RAS_REGISTER_STATE_REGISTERED)
{
*ReturnSocketAddress = m_sockAddr;
hr = S_OK;
}
else
{
hr = E_FAIL;
}
Unlock();
return hr;
}
PH323_ALIASNAMES
GetRegisteredAliasList()
{
return m_pAliasList;
}
BOOL Initialize( SOCKADDR_IN* psaGKAddr );
void Shutdown();
static void NTAPI RegExpiredCallback( PVOID dwParam1, BOOLEAN bTimer );
static void NTAPI UnregExpiredCallback( PVOID dwParam1, BOOLEAN bTimer );
static void NTAPI TTLExpiredCallback( IN PVOID dwParam1, IN BOOLEAN bTimer );
BOOL SendRRQ( IN long seqNumber, IN PALIASCHANGE_REQUEST pAliasList );
BOOL SendURQ( long seqNumber, EndpointIdentifier * pEndpointID );
void RegExpired( WORD seqNumber );
void UnregExpired( WORD seqNumber );
void TTLExpired();
static void NTAPI IoCompletionCallback(IN DWORD dwStatus, IN DWORD cbTransferred,
IN LPOVERLAPPED pOverlapped );
void OnSendComplete( IN DWORD dwStatus, RAS_SEND_CONTEXT *pOverlappedSend );
void OnRecvComplete( IN DWORD dwStatus, RAS_RECV_CONTEXT * pOverlappedRecv );
void HandleRegistryChange();
BOOL IssueSend( RasMessage * pRasMessage )
{
return EncodeSendMessage (pRasMessage) == S_OK;
}
};
void
HandleRASCallMessage(
IN RasMessage *pRasMessage
);
HRESULT RasStart (void);
void RasStop (void);
HRESULT RasSetAliasList (
IN AliasAddress * AliasArray,
IN DWORD Count);
BOOL RasIsRegistered (void);
HRESULT RasGetLocalAddress (
OUT SOCKADDR_IN * ReturnLocalAddress);
USHORT RasAllocSequenceNumber (void);
HRESULT RasGetEndpointID (
OUT EndpointIdentifier * ReturnEndpointID);
HRESULT RasEncodeSendMessage (
IN RasMessage * RasMessage);
PH323_ALIASNAMES RASGetRegisteredAliasList();
void RasHandleRegistryChange();
#endif //_RAS_H_