626 lines
18 KiB
C
626 lines
18 KiB
C
/*++
|
||
|
||
Copyright (c) 1994 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
mdhccapi.c
|
||
|
||
Abstract:
|
||
|
||
This file contains the client side APIs for the MCAST.
|
||
|
||
Author:
|
||
|
||
Munil Shah (munils) 02-Sept-97
|
||
|
||
Environment:
|
||
|
||
User Mode - Win32
|
||
|
||
Revision History:
|
||
|
||
|
||
--*/
|
||
#include "precomp.h"
|
||
#include <dhcploc.h>
|
||
#include <dhcppro.h>
|
||
#include "mdhcpcli.h"
|
||
|
||
DWORD
|
||
MadcapInitGlobalData(
|
||
VOID
|
||
);
|
||
|
||
VOID
|
||
MadcapCleanupGlobalData(
|
||
VOID
|
||
);
|
||
|
||
DWORD
|
||
APIENTRY
|
||
McastApiStartup(
|
||
IN OUT PDWORD pVersion
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine returns the current version of the apis and allocates any
|
||
necessary resources.
|
||
|
||
Arguments:
|
||
|
||
pVersion - Version of the api clients. On return contains version of the
|
||
api implementation.
|
||
|
||
Return Value:
|
||
|
||
ERROR_NOT_SUPPORTED if client version greater than impl version.
|
||
(other Win32 errors)
|
||
|
||
--*/
|
||
{
|
||
DWORD Error;
|
||
|
||
Error = ERROR_SUCCESS;
|
||
if (!pVersion) {
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
// do we support this client version?
|
||
if (*pVersion > MCAST_API_CURRENT_VERSION) {
|
||
// not supported
|
||
Error = ERROR_NOT_SUPPORTED;
|
||
} else {
|
||
// if client specified its version, use that
|
||
// o/w assume version 1.0
|
||
if (*pVersion) {
|
||
gMadcapClientApplVersion = *pVersion;
|
||
} else {
|
||
gMadcapClientApplVersion = MCAST_API_VERSION_1;
|
||
}
|
||
}
|
||
*pVersion = MCAST_API_CURRENT_VERSION;
|
||
|
||
if( ERROR_SUCCESS == Error ) {
|
||
Error = MadcapInitGlobalData();
|
||
if (ERROR_SUCCESS != Error) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastApiStartup - Could not allocate resources %ld\n", Error));
|
||
Error = ERROR_NO_SYSTEM_RESOURCES;
|
||
}
|
||
}
|
||
|
||
return Error;
|
||
}
|
||
|
||
VOID
|
||
APIENTRY
|
||
McastApiCleanup(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine de-allocates resources allocated by the Startup routine.
|
||
It must be called only AFTER a successful call to McastApiStartup.
|
||
|
||
--*/
|
||
{
|
||
MadcapCleanupGlobalData();
|
||
}
|
||
|
||
|
||
DWORD
|
||
APIENTRY
|
||
McastEnumerateScopes(
|
||
IN IP_ADDR_FAMILY AddrFamily,
|
||
IN BOOL ReQuery,
|
||
IN OUT PMCAST_SCOPE_ENTRY pScopeList,
|
||
IN OUT PDWORD pScopeLen,
|
||
OUT PDWORD pScopeCount
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine enumerates the multicast scopes available on the network.
|
||
|
||
Arguments:
|
||
|
||
AddrFamily - AF_INET for IPv4 and AF_INET6 for IPv6
|
||
|
||
ReQuery - TRUE if the calls wants the list to be requried. FALSE o/w.
|
||
|
||
pScopeList - pointer to the buffer where the scopelist is to be retrieved.
|
||
This parameter can be NULL if only the length of the buffer is
|
||
being retrieved.
|
||
|
||
When this buffer is NULL, the API will force the re-query of the
|
||
scope list from the MCAST servers.
|
||
|
||
pScopeLen - Pointer to a variable that specifies the size, in bytes, of the
|
||
buffer pointed to by the pScopeList parameter. When the function returns,
|
||
this variable contains the size of the data copied to pScopeList;
|
||
|
||
The pScopeLen parameter can not be NULL.
|
||
|
||
If the buffer specified by pScopeList parameter is not large enough
|
||
to hold the data, the function returns the value ERROR_MORE_DATA, and
|
||
stores the required buffer size, in bytes, into the variable pointed
|
||
to by pScopeLen.
|
||
|
||
If pScopeList is NULL, and pScopeLen is non-NULL, the function returns
|
||
ERROR_SUCCESS, and stores the size of the data, in bytes, in the variable
|
||
pointed to by pScopeLen. This lets an application determine the best
|
||
way to allocate a buffer for the scope list.
|
||
|
||
pScopeCount - Pointer to a variable that will store total number of scopes returned
|
||
in the pScopeList buffer.
|
||
|
||
Return Value:
|
||
|
||
The status of the operation.
|
||
|
||
--*/
|
||
{
|
||
DWORD Error;
|
||
|
||
|
||
// First check the validity of the arguments.
|
||
|
||
// has startup been called?
|
||
if ( !gMadcapClientApplVersion ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastEnumerateScopes - Not ready. Client Version %d\n",
|
||
gMadcapClientApplVersion));
|
||
return ERROR_NOT_READY;
|
||
}
|
||
|
||
// Correct addr family?
|
||
if (AF_INET != AddrFamily) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastEnumerateScopes - Invalid AddrFamily IPv%d\n", AddrFamily));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
// pScopeLen can not be NULL.
|
||
if ( !pScopeLen || IsBadWritePtr( pScopeLen, sizeof(DWORD) ) ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastEnumerateScopes - Invalid ScopeLen param\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
// if pScopeList buffer is given, then pScopeCount can not be NULL.
|
||
if ( pScopeList &&
|
||
(!pScopeCount || IsBadWritePtr( pScopeCount, sizeof(DWORD)) ) ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastEnumerateScopes - Invalid ScopeCount param\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
// if we are not requerying the list then pScopList can not be NULL.
|
||
if (!ReQuery &&
|
||
(!pScopeList || IsBadWritePtr( pScopeList, *pScopeLen ) ) ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastEnumerateScopes - Invalid ScopeList & ReQuery param\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
// initialize the status.
|
||
Error = STATUS_SUCCESS;
|
||
|
||
// do we need to requery ?
|
||
if ( ReQuery ) {
|
||
// query the MCAST servers and get the new list of MScopes.
|
||
Error = ObtainMScopeList();
|
||
if ( ERROR_SUCCESS != Error ) {
|
||
return Error;
|
||
}
|
||
} else {
|
||
if( !gMadcapScopeList ) {
|
||
return ERROR_NO_DATA;
|
||
}
|
||
}
|
||
|
||
// Has the client specified the buffer?
|
||
if ( pScopeList ) {
|
||
// yes, copy the scopes.
|
||
DhcpPrint((DEBUG_API, "McastEnumerateScopes - Copying existing mscope list\n"));
|
||
return CopyMScopeList(
|
||
pScopeList,
|
||
pScopeLen,
|
||
pScopeCount );
|
||
} else {
|
||
// no, just return the length of the scope list and the scope count.
|
||
LOCK_MSCOPE_LIST();
|
||
if( gMadcapScopeList != NULL ) {
|
||
*pScopeLen = gMadcapScopeList->ScopeLen;
|
||
if ( pScopeCount ) *pScopeCount = gMadcapScopeList->ScopeCount;
|
||
Error = ERROR_SUCCESS;
|
||
} else {
|
||
Error = ERROR_NO_DATA;
|
||
}
|
||
UNLOCK_MSCOPE_LIST();
|
||
}
|
||
|
||
return Error;
|
||
}
|
||
|
||
|
||
DWORD
|
||
APIENTRY
|
||
McastGenUID(
|
||
IN LPMCAST_CLIENT_UID pRequestID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine generates the unique identifier which client can use to later pass
|
||
to request/renew addresses.
|
||
|
||
Arguments:
|
||
|
||
pRequestID - Pointer to the UID struct where the identifier is to be stored. The
|
||
buffer that holds the id should be at-least MCAST_CLIENT_ID_LEN long.
|
||
|
||
Return Value:
|
||
|
||
The status of the operation.
|
||
|
||
--*/
|
||
{
|
||
if (!pRequestID) {
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if (!pRequestID->ClientUID || IsBadWritePtr( pRequestID->ClientUID, pRequestID->ClientUIDLength) ) {
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
return GenMadcapClientUID( pRequestID->ClientUID, &pRequestID->ClientUIDLength );
|
||
|
||
}
|
||
|
||
DWORD
|
||
APIENTRY
|
||
McastRequestAddress(
|
||
IN IP_ADDR_FAMILY AddrFamily,
|
||
IN LPMCAST_CLIENT_UID pRequestID,
|
||
IN PMCAST_SCOPE_CTX pScopeCtx,
|
||
IN PMCAST_LEASE_REQUEST pAddrRequest,
|
||
IN OUT PMCAST_LEASE_RESPONSE pAddrResponse
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine request multicast address(es) from the MCAST server.
|
||
|
||
Arguments:
|
||
|
||
AddrFamily - AF_INET for IPv4 and AF_INET6 for IPv6
|
||
|
||
pRequestID - Unique identifier for this request. Client is responsible for
|
||
generating unique identifier for every request. One recommendation
|
||
is to use application specific context hashed by time.
|
||
|
||
pRequestIDLen - Length of the pRequestID buffer.
|
||
|
||
pScopeCtx - Pointer to the context of the scope from which the address is to
|
||
be allocated. Scope context has to be retrieved via McastEnumerateScopes
|
||
call before calling this.
|
||
|
||
pAddrRequest - Pointer to the block containing all the parameters pertaining
|
||
to multicast address request. The MCAST_API_VERSION_1 version of
|
||
implementation supports allocation of only one address at a time.
|
||
So the AddrCount and MinAddrCount value must be 1.ServerAddress
|
||
field is ignored.
|
||
|
||
pAddrResponse - Pointer to the block which contains the response paramters for
|
||
the multicast address request. The caller is responsible for allocating
|
||
the space for pAddrBuf for the requested number of addresses and
|
||
setting the pointer to that space.
|
||
|
||
Return Value:
|
||
|
||
The status of the operation.
|
||
|
||
--*/
|
||
{
|
||
PDHCP_CONTEXT pContext = NULL;
|
||
DWORD Error;
|
||
DWORD ScopeId;
|
||
time_t TimeNow;
|
||
time_t LocalLeaseStartTime;
|
||
time_t LocalMaxLeaseStartTime;
|
||
|
||
// do some param checking.
|
||
|
||
// has startup been called?
|
||
if ( !gMadcapClientApplVersion ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastRequestAddress - Not ready. Client Version %d\n",
|
||
gMadcapClientApplVersion));
|
||
return ERROR_NOT_READY;
|
||
}
|
||
|
||
if (AF_INET != AddrFamily) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastRequestAddress - Invalid AddrFamily IPv%d\n", AddrFamily));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( !pRequestID || !pRequestID->ClientUID || !pAddrRequest || !pAddrResponse ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - one of parameter is NULL\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( pAddrRequest->AddrCount != 1 || pAddrResponse->AddrCount < pAddrRequest->AddrCount) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - currently support one address - requested %ld\n",
|
||
pAddrRequest->AddrCount));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
|
||
if ( pAddrRequest->pAddrBuf &&
|
||
(*(DWORD UNALIGNED *)pAddrRequest->pAddrBuf) &&
|
||
!CLASSD_NET_ADDR(*(DWORD UNALIGNED *)pAddrRequest->pAddrBuf)) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - requested address not valid %s\n",
|
||
DhcpIpAddressToDottedString(*(DWORD UNALIGNED *)pAddrRequest->pAddrBuf)));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( !pAddrResponse->pAddrBuf ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - response buffer has null pAddrBuf\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if (pRequestID->ClientUIDLength < MCAST_CLIENT_ID_LEN) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - requestid length %d too small\n",
|
||
pRequestID->ClientUIDLength));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( !pScopeCtx ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastRequestAddress - scope context not supplied\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
time(&TimeNow);
|
||
LocalLeaseStartTime = LocalMaxLeaseStartTime = TimeNow;
|
||
if ( pAddrRequest->LeaseStartTime > LocalLeaseStartTime ) {
|
||
LocalLeaseStartTime = pAddrRequest->LeaseStartTime;
|
||
}
|
||
if ( pAddrRequest->MaxLeaseStartTime > LocalMaxLeaseStartTime ) {
|
||
LocalMaxLeaseStartTime = pAddrRequest->MaxLeaseStartTime;
|
||
}
|
||
|
||
if ( LocalLeaseStartTime > LocalMaxLeaseStartTime ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - invalid start lease times\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( pAddrRequest->LeaseDuration < pAddrRequest->MinLeaseDuration ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - invalid lease duration\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
Error = CreateMadcapContext(&pContext, pRequestID, pScopeCtx->Interface.IpAddrV4 );
|
||
if ( ERROR_SUCCESS != Error ) goto Cleanup;
|
||
APICTXT_ENABLED(pContext); // mark the context as being created by the API
|
||
|
||
if (pAddrRequest->pAddrBuf && (*(DWORD UNALIGNED *)pAddrRequest->pAddrBuf) ) {
|
||
pContext->DesiredIpAddress = *(DWORD UNALIGNED *)pAddrRequest->pAddrBuf;
|
||
}
|
||
//pContext->DhcpServerAddress = pScopeCtx->ServerID;
|
||
|
||
Error = ObtainMadcapAddress(
|
||
pContext,
|
||
&pScopeCtx->ScopeID,
|
||
pAddrRequest,
|
||
pAddrResponse
|
||
);
|
||
|
||
Cleanup:
|
||
if ( pContext )
|
||
DhcpDestroyContext( pContext );
|
||
|
||
return Error;
|
||
}
|
||
|
||
DWORD
|
||
APIENTRY
|
||
McastRenewAddress(
|
||
IN IP_ADDR_FAMILY AddrFamily,
|
||
IN LPMCAST_CLIENT_UID pRequestID,
|
||
IN PMCAST_LEASE_REQUEST pRenewRequest,
|
||
IN OUT PMCAST_LEASE_RESPONSE pRenewResponse
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine renews multicast address(es) from the MCAST server.
|
||
|
||
Arguments:
|
||
|
||
AddrFamily - AF_INET for IPv4 and AF_INET6 for IPv6
|
||
|
||
pRequestID - Unique identifier that was used when the address(es) were
|
||
obtained initially.
|
||
|
||
RequestIDLen - Length of the pRequestID buffer.
|
||
|
||
pRenewRequest - Pointer to the block containing all the parameters pertaining
|
||
to the renew request.
|
||
|
||
pRenewResponse - Pointer to the block which contains the response paramters for
|
||
the renew request.The caller is responsible for allocating the
|
||
space for pAddrBuf for the requested number of addresses and
|
||
setting the pointer to that space.
|
||
|
||
Return Value:
|
||
|
||
The status of the operation.
|
||
|
||
--*/
|
||
{
|
||
|
||
PDHCP_CONTEXT pContext = NULL;
|
||
DWORD Error;
|
||
DHCP_IP_ADDRESS SelectedServer;
|
||
DWORD ScopeId;
|
||
time_t TimeNow;
|
||
|
||
// do some param checking.
|
||
|
||
// has startup been called?
|
||
if ( !gMadcapClientApplVersion ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastRenewAddress - Not ready. Client Version %d\n",
|
||
gMadcapClientApplVersion));
|
||
return ERROR_NOT_READY;
|
||
}
|
||
|
||
if (AF_INET != AddrFamily) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastRenewAddress - Invalid AddrFamily IPv%d\n", AddrFamily));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( !pRequestID || !pRenewRequest || !pRenewResponse ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRenewAddress - one of parameter is NULL\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( pRenewRequest->AddrCount != 1 ||
|
||
pRenewResponse->AddrCount < pRenewRequest->AddrCount ||
|
||
!pRenewResponse->pAddrBuf ||
|
||
!pRenewRequest->pAddrBuf ||
|
||
!CLASSD_NET_ADDR( *(DWORD UNALIGNED *)pRenewRequest->pAddrBuf) ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRenewAddress - address %s type V%d count %ld is invalid\n",
|
||
DhcpIpAddressToDottedString( *(DWORD UNALIGNED *)pRenewRequest->pAddrBuf),
|
||
pRenewRequest->AddrCount ));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if (!pRenewRequest->ServerAddress.IpAddrV4) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - server address not specified \n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
if (pRequestID->ClientUIDLength < MCAST_CLIENT_ID_LEN) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRenewAddress - requestid length too small\n",
|
||
pRequestID->ClientUIDLength));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
time(&TimeNow);
|
||
if ( pRenewRequest->LeaseStartTime > pRenewRequest->MaxLeaseStartTime ||
|
||
(pRenewRequest->LeaseDuration < pRenewRequest->MinLeaseDuration)) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRenewAddress - invalid lease times\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
Error = CreateMadcapContext(&pContext, pRequestID, INADDR_ANY);
|
||
if ( ERROR_SUCCESS != Error) return Error;
|
||
APICTXT_ENABLED(pContext); // mark the context as being created by the API
|
||
|
||
pContext->DesiredIpAddress = *(DWORD UNALIGNED *)pRenewRequest->pAddrBuf;
|
||
pContext->DhcpServerAddress = pRenewRequest->ServerAddress.IpAddrV4;
|
||
|
||
|
||
Error = RenewMadcapAddress(
|
||
pContext,
|
||
NULL,
|
||
pRenewRequest,
|
||
pRenewResponse,
|
||
0
|
||
);
|
||
|
||
Cleanup:
|
||
|
||
if ( pContext ) DhcpDestroyContext( pContext );
|
||
return Error;
|
||
}
|
||
|
||
DWORD
|
||
APIENTRY
|
||
McastReleaseAddress(
|
||
IN IP_ADDR_FAMILY AddrFamily,
|
||
IN LPMCAST_CLIENT_UID pRequestID,
|
||
IN PMCAST_LEASE_REQUEST pReleaseRequest
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
|
||
This routine releases multicast address(es) from the MCAST server.
|
||
|
||
Arguments:
|
||
|
||
AddrFamily - AF_INET for IPv4 and AF_INET6 for IPv6
|
||
|
||
pRequestID - Unique identifier that was used when the address(es) were
|
||
obtained initially.
|
||
|
||
pReleaseRequest - Pointer to the block containing all the parameters pertaining
|
||
to the release request.
|
||
|
||
Return Value:
|
||
|
||
The status of the operation.
|
||
|
||
--*/
|
||
{
|
||
PDHCP_CONTEXT pContext = NULL;
|
||
DWORD Error;
|
||
DHCP_IP_ADDRESS SelectedServer;
|
||
DWORD ScopeId;
|
||
|
||
// do some param checking.
|
||
|
||
// has startup been called?
|
||
if ( !gMadcapClientApplVersion ) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastReleaseAddress - Not ready. Client Version %d\n",
|
||
gMadcapClientApplVersion));
|
||
return ERROR_NOT_READY;
|
||
}
|
||
|
||
if (AF_INET != AddrFamily) {
|
||
DhcpPrint((DEBUG_ERRORS, "McastReleaseAddress - Invalid AddrFamily IPv%d\n", AddrFamily));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( !pRequestID || !pReleaseRequest ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastReleaseAddress - one of parameter is NULL\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if ( pReleaseRequest->AddrCount != 1 ||
|
||
!pReleaseRequest->pAddrBuf ||
|
||
!CLASSD_NET_ADDR( *(DWORD UNALIGNED *)pReleaseRequest->pAddrBuf) ) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastReleaseAddress - address %s count %ld is invalid\n",
|
||
DhcpIpAddressToDottedString( *(DWORD UNALIGNED *)pReleaseRequest->pAddrBuf), pReleaseRequest->AddrCount ));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if (!pReleaseRequest->ServerAddress.IpAddrV4) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastReleaseAddress - server address is invalid\n"));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
if (pRequestID->ClientUIDLength < MCAST_CLIENT_ID_LEN) {
|
||
DhcpPrint((DEBUG_ERRORS,"McastRequestAddress - requestid length too small\n",
|
||
pRequestID->ClientUIDLength));
|
||
return ERROR_INVALID_PARAMETER;
|
||
}
|
||
|
||
Error = CreateMadcapContext(&pContext, pRequestID, INADDR_ANY );
|
||
if ( ERROR_SUCCESS != Error) return Error;
|
||
APICTXT_ENABLED(pContext); // mark the context as being created by the API
|
||
|
||
pContext->DhcpServerAddress = pReleaseRequest->ServerAddress.IpAddrV4;
|
||
|
||
Error = ReleaseMadcapAddress(pContext);
|
||
|
||
Cleanup:
|
||
|
||
if ( pContext ) DhcpDestroyContext( pContext );
|
||
return Error;
|
||
}
|
||
|
||
|
||
|