145 lines
2.2 KiB
C
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);
|
||
|
}
|