134 lines
4.4 KiB
C++
134 lines
4.4 KiB
C++
/***************************************************************************
|
|
*
|
|
* Copyright (C) 2001 Microsoft Corporation. All Rights Reserved.
|
|
*
|
|
* File: dpnhupnpcachemap.h
|
|
*
|
|
* Content: Header for cached mapping object class.
|
|
*
|
|
* History:
|
|
* Date By Reason
|
|
* ======== ======== =========
|
|
* 04/16/01 VanceO Split DPNATHLP into DPNHUPNP and DPNHPAST.
|
|
*
|
|
***************************************************************************/
|
|
|
|
|
|
|
|
//=============================================================================
|
|
// Object flags
|
|
//=============================================================================
|
|
#define CACHEMAPOBJ_TCP DPNHQUERYADDRESS_TCP // a TCP port instead of UDP
|
|
#define CACHEMAPOBJ_NOTFOUND DPNHQUERYADDRESS_CACHENOTFOUND // the address was actually not found
|
|
#define CACHEMAPOBJ_PRIVATEBUTUNMAPPED DPNHQUERYADDRESS_CHECKFORPRIVATEBUTUNMAPPED // the address is private, but was not mapped on the Internet gateway
|
|
|
|
|
|
|
|
//=============================================================================
|
|
// Macros
|
|
//=============================================================================
|
|
#define CACHEMAP_FROM_BILINK(b) (CONTAINING_OBJECT(b, CCacheMap, m_blList))
|
|
|
|
//
|
|
// TCP queries need to match TCP mappings, (and UDP needs to match UDP).
|
|
//
|
|
#define QUERYFLAGSMASK(dwFlags) (dwFlags & DPNHQUERYADDRESS_TCP)
|
|
|
|
|
|
|
|
//=============================================================================
|
|
// Forward declarations
|
|
//=============================================================================
|
|
class CCacheMap;
|
|
|
|
|
|
|
|
|
|
//=============================================================================
|
|
// Main interface object class
|
|
//=============================================================================
|
|
class CCacheMap
|
|
{
|
|
public:
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CCacheMap::CCacheMap"
|
|
CCacheMap(const SOCKADDR_IN * const psaddrinQueryAddress,
|
|
const DWORD dwExpirationTime,
|
|
const DWORD dwFlags)
|
|
{
|
|
this->m_blList.Initialize();
|
|
|
|
this->m_Sig[0] = 'C';
|
|
this->m_Sig[1] = 'M';
|
|
this->m_Sig[2] = 'A';
|
|
this->m_Sig[3] = 'P';
|
|
this->m_dwQueryAddressV4 = psaddrinQueryAddress->sin_addr.S_un.S_addr;
|
|
this->m_wQueryPort = psaddrinQueryAddress->sin_port;
|
|
this->m_dwFlags = dwFlags; // works because CACHEMAPOBJ_xxx == DPNHQUERYADDRESS_xxx.
|
|
this->m_dwExpirationTime = dwExpirationTime;
|
|
};
|
|
|
|
#undef DPF_MODNAME
|
|
#define DPF_MODNAME "CCacheMap::~CCacheMap"
|
|
~CCacheMap(void)
|
|
{
|
|
DNASSERT(this->m_blList.IsEmpty());
|
|
};
|
|
|
|
inline BOOL DoesMatchQuery(const SOCKADDR_IN * const psaddrinQueryAddress,
|
|
const DWORD dwFlags) const
|
|
{
|
|
//
|
|
// Is this even the right address?
|
|
//
|
|
if ((this->m_dwQueryAddressV4 != psaddrinQueryAddress->sin_addr.S_un.S_addr) ||
|
|
(this->m_wQueryPort != psaddrinQueryAddress->sin_port))
|
|
{
|
|
return FALSE;
|
|
}
|
|
|
|
//
|
|
// Of the ones that matter (QUERYFLAGSMASK), make sure all
|
|
// required flags are present, and all flags that aren't
|
|
// required are not present.
|
|
// Remember CACHEMAPOBJ_xxx == DPNHQUERYADDRESS_xxx.
|
|
//
|
|
return ((QUERYFLAGSMASK(this->m_dwFlags) == QUERYFLAGSMASK(dwFlags)) ? TRUE : FALSE);
|
|
};
|
|
|
|
inline BOOL IsNotFound(void) const { return ((this->m_dwFlags & CACHEMAPOBJ_NOTFOUND) ? TRUE : FALSE); };
|
|
inline BOOL IsPrivateButUnmapped(void) const { return ((this->m_dwFlags & CACHEMAPOBJ_PRIVATEBUTUNMAPPED) ? TRUE : FALSE); };
|
|
|
|
inline void GetResponseAddressV4(SOCKADDR_IN * const psaddrinAddress) const
|
|
{
|
|
ZeroMemory(psaddrinAddress, sizeof(*psaddrinAddress));
|
|
psaddrinAddress->sin_family = AF_INET;
|
|
psaddrinAddress->sin_addr.S_un.S_addr = this->m_dwResponseAddressV4;
|
|
psaddrinAddress->sin_port = this->m_wResponsePort;
|
|
};
|
|
|
|
inline DWORD GetExpirationTime(void) const { return this->m_dwExpirationTime; };
|
|
|
|
inline void SetResponseAddressV4(const DWORD dwAddressV4,
|
|
const WORD wPort)
|
|
{
|
|
this->m_dwResponseAddressV4 = dwAddressV4;
|
|
this->m_wResponsePort = wPort;
|
|
};
|
|
|
|
|
|
CBilink m_blList; // list of all the mappings cached
|
|
|
|
|
|
private:
|
|
BYTE m_Sig[4]; // debugging signature ('CMAP')
|
|
DWORD m_dwFlags; // flags for this object
|
|
|
|
DWORD m_dwQueryAddressV4; // IPv4 address searched
|
|
WORD m_wQueryPort; // IPv4 port searched
|
|
DWORD m_dwResponseAddressV4; // IPv4 address mapping corresponding to query
|
|
WORD m_wResponsePort; // IPv4 port mapping corresponding to query
|
|
DWORD m_dwExpirationTime; // time when this cached mapping expires
|
|
};
|
|
|