windows-nt/Source/XPSP1/NT/inetsrv/iis/svcs/loadbal/serv/iislbh.hxx
2020-09-26 16:20:57 +08:00

143 lines
4.5 KiB
C++

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
iislbh.hxx
Abstract:
Definition of Kernel Load balancing structures
Author:
Philippe Choquier (phillich)
--*/
#if !defined( _IISLBH_HXX )
#define _IISLBH_HXX
#define LOADBAL_SAMPLES 6
#define LOADBAL_NORMALIZED_TOTAL 10000
#define DEFAULT_STICKY_DURATION (60*10) // in seconds
#pragma warning( disable:4200 )
#pragma pack(1)
struct CKernelIpEndpoint {
DWORD m_dwIpAddress;
USHORT m_usPort;
};
struct CKernelIpEndpointEx {
DWORD m_dwIpAddress;
USHORT m_usPort;
USHORT m_usUniquePort; // non-zero only once in list for given port
DWORD m_dwRefCount; // used as refcount for user>kernel IOCTL
DWORD m_dwIndex; // used as old cnfg -> new cnfg index in kernel
DWORD m_dwNotifyPort; // used by driver to build notify/unnotify list
DWORD m_dwSticky; // sticky duration ( in seconds ), only for public IP addr
LPVOID m_pvDirectorHandle; // NAT handle after register port
} ;
typedef DWORD IPREF;
struct CKernelServerDescription {
DWORD m_dwLoadAvail;
INT m_LoadbalancedLoadAvail;
float m_flLoadAvailAvg;
float m_flLoadAvail[LOADBAL_SAMPLES];
DWORD m_cNbSamplesAvail;
DWORD m_dwHeartbeat;
BYTE m_bArray[0];
// array of IPREF[m_dwPublicIpCount]
} ;
#define UNAVAIL_HEARTBEAT 0x56349812
struct CKernelIpMap {
DWORD m_dwServerCount;
DWORD m_dwPublicIpCount;
DWORD m_dwPrivateIpCount;
DWORD m_dwStickyDuration;
BYTE m_bArray[0];
// array of CKernelIpEndpointEx[m_dwPublicIpCount]
// array of CKernelIpEndpointEx[m_dwPrivateIpCount]
// array of CKernelServerDescription[m_dwServerCount]
};
#pragma pack()
class CKernelIpMapMinHelper {
public:
CKernelIpMapMinHelper()
{ m_pKernelIpMap = NULL; }
VOID SetBuffer( LPVOID pV )
{ m_pKernelIpMap = (CKernelIpMap*)pV; }
LPVOID GetBuffer()
{ return (LPVOID)m_pKernelIpMap; }
UINT ServerCount()
{ return m_pKernelIpMap->m_dwServerCount; }
UINT PublicIpCount()
{ return m_pKernelIpMap->m_dwPublicIpCount; }
UINT PrivateIpCount()
{ return m_pKernelIpMap->m_dwPrivateIpCount; }
BOOL SetStickyDuration(DWORD dw)
{ m_pKernelIpMap->m_dwStickyDuration = dw; return TRUE; }
DWORD GetStickyDuration()
{ return m_pKernelIpMap->m_dwStickyDuration; }
CKernelIpEndpointEx* GetPublicIpPtr( UINT i )
{ return (CKernelIpEndpointEx*)(m_pKernelIpMap->m_bArray + sizeof(CKernelIpEndpointEx)*i); }
CKernelServerDescription* GetServerPtr( UINT i, LPBYTE pBase = NULL, DWORD dwPub = -1, DWORD dwPriv = -1 )
{
if ( pBase == NULL ) pBase = (LPBYTE)m_pKernelIpMap;
if ( dwPub == -1 ) dwPub = m_pKernelIpMap->m_dwPublicIpCount;
if ( dwPriv == -1 ) dwPriv = m_pKernelIpMap->m_dwPrivateIpCount;
return (CKernelServerDescription*)(pBase + sizeof(CKernelIpMap) +
dwPub * sizeof(CKernelIpEndpointEx) +
dwPriv * sizeof(CKernelIpEndpointEx) +
i * (sizeof(CKernelServerDescription) + dwPub * sizeof(IPREF) ));
}
CKernelIpEndpointEx* GetPrivateIpEndpoint( DWORD dw, LPBYTE pBase = NULL )
{
if ( pBase == NULL ) pBase = (LPBYTE)m_pKernelIpMap;
return (CKernelIpEndpointEx*)((LPBYTE)pBase + sizeof(CKernelIpMap) +
((CKernelIpMap*)pBase)->m_dwPublicIpCount * sizeof(CKernelIpEndpointEx) +
dw * sizeof(CKernelIpEndpointEx) ); };
IPREF* GetPrivateIpRef( CKernelServerDescription* pS, DWORD dw)
{ return (IPREF*)(pS->m_bArray+dw*sizeof(IPREF)); }
//CKernelIpEndpointEx* GetPrivateIpPtr( CKernelServerDescription* pS, DWORD dw)
// { return GetPrivateIpEndpoint( *GetPrivateIpRef( pS, dw) ); }
DWORD GetKernelServerDescriptionSize()
{ return sizeof(CKernelServerDescription) + m_pKernelIpMap->m_dwPublicIpCount * sizeof(IPREF); }
DWORD GetSize( DWORD dwServer, DWORD dwPublicIp, DWORD dwPrivateIp )
{ return sizeof(CKernelIpMap) +
dwPublicIp * sizeof(CKernelIpEndpointEx) +
dwPrivateIp * sizeof(CKernelIpEndpointEx) +
dwServer * ( sizeof(CKernelServerDescription) + dwPublicIp * sizeof(IPREF) ); }
DWORD GetSize()
{ return GetSize( ServerCount(), PublicIpCount(), PrivateIpCount() ); }
protected:
CKernelIpMap* m_pKernelIpMap;
} ;
#endif