/*++ 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 #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); }