windows-nt/Source/XPSP1/NT/net/atm/rawwan/sys/vc.c
2020-09-26 16:20:57 +08:00

145 lines
2.2 KiB
C

/*++
Copyright (c) 1997 Microsoft Corporation
Module Name:
D:\nt\private\ntos\tdi\rawwan\core\vc.c
Abstract:
Routines that manage NDIS VC objects.
Revision History:
Who When What
-------- -------- ----------------------------------------------
arvindm 05-05-97 Created
Notes:
--*/
#include <precomp.h>
#define _FILENUMBER ' CV'
PRWAN_NDIS_VC
RWanAllocateVc(
IN PRWAN_NDIS_AF pAf,
IN BOOLEAN IsOutgoing
)
/*++
Routine Description:
Allocate and initialize an NDIS VC endpoint on the specified
Address Family. If it is an "outgoing" VC, we also request
NDIS to allocate a handle for it.
Arguments:
pAf - Points to NDIS AF block
IsOutgoing - This VC is for an outgoing call
Return Value:
Pointer to VC if successful, NULL otherwise.
--*/
{
PRWAN_NDIS_VC pVc;
NDIS_STATUS Status;
RWAN_ALLOC_MEM(pVc, RWAN_NDIS_VC, sizeof(RWAN_NDIS_VC));
if (pVc != NULL)
{
RWAN_ZERO_MEM(pVc, sizeof(RWAN_NDIS_VC));
RWAN_SET_SIGNATURE(pVc, nvc);
pVc->pNdisAf = pAf;
pVc->MaxSendSize = 0; // Initialize.
RWAN_INIT_LIST(&(pVc->NdisPartyList));
if (IsOutgoing)
{
//
// Request the Call manager and Miniport to create a VC.
//
Status = NdisCoCreateVc(
pAf->pAdapter->NdisAdapterHandle,
pAf->NdisAfHandle,
(NDIS_HANDLE)pVc,
&(pVc->NdisVcHandle)
);
if (Status == NDIS_STATUS_SUCCESS)
{
//
// Add this VC to the list on the AF Block.
//
RWAN_ACQUIRE_AF_LOCK(pAf);
RWAN_INSERT_TAIL_LIST(&(pAf->NdisVcList),
&(pVc->VcLink));
RWanReferenceAf(pAf); // New outgoing VC ref
RWAN_RELEASE_AF_LOCK(pAf);
}
else
{
RWAN_FREE_MEM(pVc);
pVc = NULL;
}
}
else
{
//
// Add this VC to the list on the AF Block.
//
RWAN_ACQUIRE_AF_LOCK(pAf);
RWAN_INSERT_TAIL_LIST(&(pAf->NdisVcList),
&(pVc->VcLink));
RWanReferenceAf(pAf); // New incoming VC ref
RWAN_RELEASE_AF_LOCK(pAf);
}
}
return (pVc);
}
VOID
RWanFreeVc(
IN PRWAN_NDIS_VC pVc
)
/*++
Routine Description:
Free a VC structure.
Arguments:
pVc - Pointer to VC to be freed.
Return Value:
None
--*/
{
RWAN_FREE_MEM(pVc);
}