|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1990-1992 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: transfer.c ! 8: ! 9: Abstract: ! 10: ! 11: This file contains the code to implement the MacTransferData ! 12: API for the NDIS 3.0 interface. ! 13: ! 14: Author: ! 15: ! 16: Anthony V. Ercolano (Tonye) 12-Sept-1990 ! 17: ! 18: Environment: ! 19: ! 20: Kernel Mode - Or whatever is the equivalent. ! 21: ! 22: Revision History: ! 23: ! 24: ! 25: --*/ ! 26: ! 27: #include <ndis.h> ! 28: #include <efilter.h> ! 29: ! 30: #include <sonichrd.h> ! 31: #include <sonicsft.h> ! 32: ! 33: ! 34: extern ! 35: NDIS_STATUS ! 36: SonicTransferData( ! 37: IN NDIS_HANDLE MacBindingHandle, ! 38: IN NDIS_HANDLE MacReceiveContext, ! 39: IN UINT ByteOffset, ! 40: IN UINT BytesToTransfer, ! 41: OUT PNDIS_PACKET Packet, ! 42: OUT PUINT BytesTransferred ! 43: ) ! 44: ! 45: /*++ ! 46: ! 47: Routine Description: ! 48: ! 49: A protocol calls the SonicTransferData request (indirectly via ! 50: NdisTransferData) from within its Receive event handler ! 51: to instruct the MAC to copy the contents of the received packet ! 52: a specified paqcket buffer. ! 53: ! 54: Arguments: ! 55: ! 56: MacBindingHandle - The context value returned by the MAC when the ! 57: adapter was opened. In reality this is a pointer to SONIC_OPEN. ! 58: ! 59: MacReceiveContext - The context value passed by the MAC on its call ! 60: to NdisIndicateReceive. The MAC can use this value to determine ! 61: which packet, on which adapter, is being received. ! 62: ! 63: ByteOffset - An unsigned integer specifying the offset within the ! 64: received packet at which the copy is to begin. If the entire packet ! 65: is to be copied, ByteOffset must be zero. ! 66: ! 67: BytesToTransfer - An unsigned integer specifying the number of bytes ! 68: to copy. It is legal to transfer zero bytes; this has no effect. If ! 69: the sum of ByteOffset and BytesToTransfer is greater than the size ! 70: of the received packet, then the remainder of the packet (starting from ! 71: ByteOffset) is transferred, and the trailing portion of the receive ! 72: buffer is not modified. ! 73: ! 74: Packet - A pointer to a descriptor for the packet storage into which ! 75: the MAC is to copy the received packet. ! 76: ! 77: BytesTransfered - A pointer to an unsigned integer. The MAC writes ! 78: the actual number of bytes transferred into this location. This value ! 79: is not valid if the return status is STATUS_PENDING. ! 80: ! 81: Return Value: ! 82: ! 83: The function value is the status of the operation. ! 84: ! 85: ! 86: --*/ ! 87: ! 88: { ! 89: ! 90: PSONIC_ADAPTER Adapter; ! 91: ! 92: NDIS_STATUS StatusToReturn; ! 93: ! 94: Adapter = PSONIC_ADAPTER_FROM_BINDING_HANDLE(MacBindingHandle); ! 95: ! 96: NdisAcquireSpinLock(&Adapter->Lock); ! 97: Adapter->References++; ! 98: ! 99: if (!Adapter->ResetInProgress) { ! 100: ! 101: PSONIC_OPEN Open = PSONIC_OPEN_FROM_BINDING_HANDLE(MacBindingHandle); ! 102: ! 103: if (!Open->BindingShuttingDown) { ! 104: ! 105: Open->References++; ! 106: ! 107: NdisReleaseSpinLock(&Adapter->Lock); ! 108: ! 109: // ! 110: // Determine if this was a loopback packet. ! 111: // ! 112: ! 113: if (MacReceiveContext == (NDIS_HANDLE)NULL) { ! 114: ! 115: NdisCopyFromPacketToPacket( ! 116: Packet, ! 117: 0, ! 118: BytesToTransfer, ! 119: Adapter->CurrentLoopbackPacket, ! 120: ByteOffset + 14, ! 121: BytesTransferred ! 122: ); ! 123: ! 124: } else { ! 125: ! 126: SonicCopyFromBufferToPacket( ! 127: (PCHAR)MacReceiveContext + ByteOffset, ! 128: BytesToTransfer, ! 129: Packet, ! 130: 0, ! 131: BytesTransferred ! 132: ); ! 133: ! 134: } ! 135: ! 136: NdisAcquireSpinLock(&Adapter->Lock); ! 137: Open->References--; ! 138: StatusToReturn = NDIS_STATUS_SUCCESS; ! 139: ! 140: } else { ! 141: ! 142: StatusToReturn = NDIS_STATUS_REQUEST_ABORTED; ! 143: ! 144: } ! 145: ! 146: } else { ! 147: ! 148: StatusToReturn = NDIS_STATUS_RESET_IN_PROGRESS; ! 149: ! 150: } ! 151: ! 152: SONIC_DO_DEFERRED(Adapter); ! 153: return StatusToReturn; ! 154: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.