Leaked source code of windows server 2003
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/***************************************************************************
* * 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
};
|