windows-nt/Source/XPSP1/NT/net/ias/protocol/proxy/radproxyp.cpp

112 lines
2.2 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (c) Microsoft Corporation
//
// FILE
//
// radproxyp.cpp
//
// SYNOPSIS
//
// Defines classes that are used in the implementation of RadiusProxy, but
// need not be visible to clients.
//
///////////////////////////////////////////////////////////////////////////////
#include <proxypch.h>
#include <radproxyp.h>
ProxyContext::~ProxyContext() throw ()
{
if (context)
{
// Our ref count dropped to zero, but we still have a context object.
// That means no one is going to take ownership.
RadiusProxyEngine::onRequestAbandoned(context, primary);
}
}
LONG Request::theNextRequestID;
Request::Request(
ProxyContext* context,
RemoteServer* destination,
BYTE packetCode
) throw ()
: ctxt(context),
dst(destination),
id(InterlockedIncrement(&theNextRequestID)),
code(packetCode)
{
identifier = port().getIdentifier();
}
bool Request::onReceive() throw ()
{
// Compute the round-trip time.
timeStamp = GetSystemTime64() - timeStamp;
// Cancel the request timeout timer.
cancelTimer();
// Update server state.
return dst->onReceive();
}
void Request::AddRef() throw ()
{
++refCount;
}
void Request::Release() throw ()
{
if (--refCount == 0) { delete this; }
}
void Request::onExpiry() throw ()
{
RadiusProxyEngine::onRequestTimeout(this);
}
const void* Request::getKey() const throw ()
{
return &id;
}
bool Request::matches(const void* key) const throw ()
{
return id == *(PLONG)key;
}
ULONG WINAPI Request::hash(const void* key) throw ()
{
return *(PLONG)key;
}
void Session::AddRef() throw ()
{
++refCount;
}
void Session::Release() throw ()
{
if (--refCount == 0) { delete this; }
}
const void* Session::getKey() const throw ()
{
return &state;
}
bool Session::matches(const void* key) const throw ()
{
const RadiusRawOctets* p = (const RadiusRawOctets*)key;
return state.length() == p->len && !memcmp(state, p->value, p->len);
}
ULONG WINAPI Session::hash(const void* key) throw ()
{
const RadiusRawOctets* p = (const RadiusRawOctets*)key;
return IASHashBytes(p->value, p->len);
}