|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1990 Microsoft Corporation ! 4: ! 5: Module Name: ! 6: ! 7: loopback.c ! 8: ! 9: Abstract: ! 10: ! 11: The routines here indicate packets on the loopback queue and are ! 12: responsible for inserting and removing packets from the loopback ! 13: queue and the send finishing queue. ! 14: ! 15: Author: ! 16: ! 17: Anthony V. Ercolano (Tonye) 12-Sept-1990 ! 18: ! 19: Environment: ! 20: ! 21: Operates at dpc level - or the equivalent on os2 and dos. ! 22: ! 23: Revision History: ! 24: ! 25: ! 26: --*/ ! 27: ! 28: #include <ndis.h> ! 29: #include <efilter.h> ! 30: #include <lancehrd.h> ! 31: #include <lancesft.h> ! 32: ! 33: ! 34: extern ! 35: VOID ! 36: LanceProcessLoopback( ! 37: IN PLANCE_ADAPTER Adapter ! 38: ) ! 39: ! 40: /*++ ! 41: ! 42: Routine Description: ! 43: ! 44: This routine is responsible for indicating *one* packet on ! 45: the loopback queue either completing it or moving on to the ! 46: finish send queue. ! 47: ! 48: NOTE: THIS IS CALLED WITH THE SPIN LOCK HELD!! ! 49: ! 50: Arguments: ! 51: ! 52: Adapter - The adapter whose loopback queue we are processing. ! 53: ! 54: Return Value: ! 55: ! 56: None. ! 57: ! 58: --*/ ! 59: ! 60: { ! 61: // ! 62: // Packet at the head of the loopback list. ! 63: // ! 64: PNDIS_PACKET PacketToMove; ! 65: ! 66: // ! 67: // The reserved portion of the above packet. ! 68: // ! 69: PLANCE_RESERVED Reserved; ! 70: ! 71: // ! 72: // Eventually the length of the data to be indicated ! 73: // to the transport. ! 74: // ! 75: UINT BufferLength; ! 76: ! 77: // ! 78: // Length of the packet ! 79: // ! 80: UINT TotalPacketLength; ! 81: ! 82: PLANCE_OPEN Open; ! 83: ! 84: PacketToMove = Adapter->FirstLoopBack; ! 85: ! 86: Adapter->IndicatingMacReceiveContext.WholeThing = (UINT)PacketToMove; ! 87: ! 88: Adapter->IndicatedAPacket = TRUE; ! 89: ! 90: Reserved = PLANCE_RESERVED_FROM_PACKET(PacketToMove); ! 91: ! 92: Open = PLANCE_OPEN_FROM_BINDING_HANDLE(Reserved->MacBindingHandle); ! 93: ! 94: if (!Reserved->Next) { ! 95: ! 96: Adapter->LastLoopBack = NULL; ! 97: ! 98: } ! 99: ! 100: Adapter->FirstLoopBack = Reserved->Next; ! 101: ! 102: Adapter->IndicatingMacReceiveContext.WholeThing = (UINT)PacketToMove; ! 103: ! 104: NdisReleaseSpinLock(&Adapter->Lock); ! 105: ! 106: // ! 107: // See if we need to copy the data from the packet ! 108: // into the lookahead buffer. ! 109: // ! 110: // We need to copy to the adapter lookahead buffer if ! 111: // the first buffer of the packet is less than the ! 112: // minimum loopback size AND the first buffer isn't ! 113: // the total packet. ! 114: // ! 115: ! 116: NdisQueryPacket( ! 117: PacketToMove, ! 118: NULL, ! 119: NULL, ! 120: NULL, ! 121: &TotalPacketLength ! 122: ); ! 123: ! 124: BufferLength = ((TotalPacketLength < (Adapter->MaxLookAhead + LANCE_HEADER_SIZE))? ! 125: TotalPacketLength : ! 126: Adapter->MaxLookAhead + LANCE_HEADER_SIZE); ! 127: ! 128: LanceCopyFromPacketToBuffer( ! 129: PacketToMove, ! 130: 0, ! 131: Adapter->SizeOfReceiveBuffer, ! 132: Adapter->Lookahead, ! 133: &BufferLength ! 134: ); ! 135: ! 136: // ! 137: // Indicate the packet to every open binding ! 138: // that could want it. ! 139: // ! 140: ! 141: if (BufferLength < LANCE_HEADER_SIZE) { ! 142: ! 143: if (BufferLength >= ETH_LENGTH_OF_ADDRESS) { ! 144: ! 145: // ! 146: // Runt packet ! 147: // ! 148: ! 149: EthFilterIndicateReceive( ! 150: Adapter->FilterDB, ! 151: PacketToMove, ! 152: ((PCHAR)(Adapter->Lookahead)), ! 153: Adapter->Lookahead, ! 154: BufferLength, ! 155: NULL, ! 156: 0, ! 157: 0 ! 158: ); ! 159: } ! 160: ! 161: } else { ! 162: ! 163: EthFilterIndicateReceive( ! 164: Adapter->FilterDB, ! 165: PacketToMove, ! 166: ((PCHAR)(Adapter->Lookahead)), ! 167: Adapter->Lookahead, ! 168: LANCE_HEADER_SIZE, ! 169: Adapter->Lookahead + LANCE_HEADER_SIZE, ! 170: BufferLength - LANCE_HEADER_SIZE, ! 171: TotalPacketLength - LANCE_HEADER_SIZE ! 172: ); ! 173: ! 174: } ! 175: ! 176: NdisCompleteSend( ! 177: Open->NdisBindingContext, ! 178: PacketToMove, ! 179: ((Reserved->SuccessfulTransmit)? ! 180: (NDIS_STATUS_SUCCESS):(NDIS_STATUS_FAILURE)) ! 181: ); ! 182: ! 183: ! 184: NdisAcquireSpinLock(&Adapter->Lock); ! 185: ! 186: // ! 187: // Remove reference for packet ! 188: // ! 189: ! 190: Open->References--; ! 191: ! 192: } ! 193:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.