Annotation of ntddk/src/network/packet/driver/read.c, revision 1.1

1.1     ! root        1: /*++
        !             2: 
        !             3: Copyright (c) 1990  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     packet.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11: 
        !            12: Author:
        !            13: 
        !            14: 
        !            15: Environment:
        !            16: 
        !            17:     Kernel mode only.
        !            18: 
        !            19: Notes:
        !            20: 
        !            21: 
        !            22: Future:
        !            23: 
        !            24: 
        !            25: 
        !            26: Revision History:
        !            27: 
        !            28: --*/
        !            29: 
        !            30: #include "stdarg.h"
        !            31: #include "ntddk.h"
        !            32: #include "ntiologc.h"
        !            33: #include "ndis.h"
        !            34: 
        !            35: #include "debug.h"
        !            36: #include "packet.h"
        !            37: 
        !            38: 
        !            39: 
        !            40: NTSTATUS
        !            41: PacketRead(
        !            42:     IN PDEVICE_OBJECT DeviceObject,
        !            43:     IN PIRP Irp
        !            44:     )
        !            45: 
        !            46: /*++
        !            47: 
        !            48: Routine Description:
        !            49: 
        !            50:     This is the dispatch routine for create/open and close requests.
        !            51:     These requests complete successfully.
        !            52: 
        !            53: Arguments:
        !            54: 
        !            55:     DeviceObject - Pointer to the device object.
        !            56: 
        !            57:     Irp - Pointer to the request packet.
        !            58: 
        !            59: Return Value:
        !            60: 
        !            61:     Status is returned.
        !            62: 
        !            63: --*/
        !            64: 
        !            65: {
        !            66:     PIO_STACK_LOCATION  IrpSp;
        !            67:     PDEVICE_EXTENSION   DeviceExtension;
        !            68:     PLIST_ENTRY         PacketListEntry;
        !            69:     PNDIS_PACKET        pPacket;
        !            70:     PMDL                pMdl;
        !            71: 
        !            72: 
        !            73:     IF_LOUD(DbgPrint("Packet: Read\n");)
        !            74: 
        !            75:     DeviceExtension = DeviceObject->DeviceExtension;
        !            76: 
        !            77:     IrpSp = IoGetCurrentIrpStackLocation(Irp);
        !            78: 
        !            79:     //
        !            80:     //  See if the buffer is atleast big enough to hold the
        !            81:     //  ethernet header
        !            82:     //
        !            83:     if (IrpSp->Parameters.Read.Length < ETHERNET_HEADER_LENGTH) {
        !            84: 
        !            85:         Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        !            86:         return STATUS_UNSUCCESSFUL;
        !            87:     }
        !            88: 
        !            89:     //
        !            90:     //  Allocate an MDL to map the portion of the buffer following the
        !            91:     //  header
        !            92:     //
        !            93:     pMdl=IoAllocateMdl(
        !            94:               MmGetMdlVirtualAddress(Irp->MdlAddress),
        !            95:               MmGetMdlByteCount(Irp->MdlAddress),
        !            96:               FALSE,
        !            97:               FALSE,
        !            98:               NULL
        !            99:               );
        !           100: 
        !           101: 
        !           102:     if (pMdl == NULL) {
        !           103:         IF_LOUD(DbgPrint("Packet: Read-Failed to allocate Mdl\n");)
        !           104:         Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        !           105:         return STATUS_UNSUCCESSFUL;
        !           106:     }
        !           107: 
        !           108:     //
        !           109:     //  Build the mdl to point to the the portion of the buffer followin
        !           110:     //  the header
        !           111:     //
        !           112:     IoBuildPartialMdl(
        !           113:         Irp->MdlAddress,
        !           114:         pMdl,
        !           115:         ((PUCHAR)MmGetMdlVirtualAddress(Irp->MdlAddress))+ETHERNET_HEADER_LENGTH,
        !           116:         0
        !           117:         );
        !           118: 
        !           119:     //
        !           120:     //  Clear the next link in the new MDL
        !           121:     //
        !           122:     pMdl->Next=NULL;
        !           123: 
        !           124:     //
        !           125:     //  Try to get a packet from our list of free ones
        !           126:     //
        !           127:     PacketListEntry=ExInterlockedRemoveHeadList(&DeviceExtension->FreePacketList,
        !           128:                                                 &DeviceExtension->FreePacketListSpinLock);
        !           129: 
        !           130:     if (PacketListEntry == NULL) {
        !           131:         IF_LOUD(DbgPrint("Packet: Read- No free packets\n");)
        !           132: 
        !           133:         IoFreeMdl(pMdl);
        !           134:         Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        !           135:         return STATUS_UNSUCCESSFUL;
        !           136:     }
        !           137: 
        !           138:     //
        !           139:     //  Get a pointer to the packet itself
        !           140:     //
        !           141: 
        !           142:     pPacket=CONTAINING_RECORD(PacketListEntry,NDIS_PACKET,ProtocolReserved);
        !           143:     RESERVED(pPacket)->Irp=Irp;
        !           144:     RESERVED(pPacket)->pMdl=pMdl;
        !           145: 
        !           146:     IoMarkIrpPending(Irp);
        !           147:     Irp->IoStatus.Status = STATUS_PENDING;
        !           148: 
        !           149: 
        !           150:     //
        !           151:     //  Attach our new MDL to the packet
        !           152:     //
        !           153:     NdisChainBufferAtFront(pPacket,pMdl);
        !           154: 
        !           155:     //
        !           156:     //  Put this packet in a list of pending reads.
        !           157:     //  The receive indication handler will attemp to remove packets
        !           158:     //  from this list for use in transfer data calls
        !           159:     //
        !           160:     ExInterlockedInsertTailList(
        !           161:         &DeviceExtension->RcvList,
        !           162:         PacketListEntry,
        !           163:         &DeviceExtension->RcvQSpinLock);
        !           164: 
        !           165: 
        !           166: 
        !           167: 
        !           168:     return(STATUS_PENDING);
        !           169: 
        !           170: }
        !           171: 
        !           172: 
        !           173: 
        !           174: 
        !           175: NDIS_STATUS
        !           176: PacketReceiveIndicate (
        !           177:     IN NDIS_HANDLE ProtocolBindingContext,
        !           178:     IN NDIS_HANDLE MacReceiveContext,
        !           179:     IN PVOID       HeaderBuffer,
        !           180:     IN UINT        HeaderBufferSize,
        !           181:     IN PVOID       LookAheadBuffer,
        !           182:     IN UINT        LookaheadBufferSize,
        !           183:     IN UINT        PacketSize
        !           184:     )
        !           185: 
        !           186: {
        !           187:     PIO_STACK_LOCATION  IrpSp;
        !           188:     PDEVICE_EXTENSION   DeviceExtension;
        !           189:     PIRP                Irp;
        !           190:     PLIST_ENTRY         PacketListEntry;
        !           191:     PNDIS_PACKET        pPacket;
        !           192:     ULONG               SizeToTransfer;
        !           193:     NDIS_STATUS         Status;
        !           194:     UINT                BytesTransfered;
        !           195:     PVOID               pBuffer;
        !           196:     ULONG               BufferLength;
        !           197: 
        !           198:     IF_LOUD(DbgPrint("Packet: ReceiveIndicate\n");)
        !           199: 
        !           200:     DeviceExtension= (PDEVICE_EXTENSION)ProtocolBindingContext;
        !           201: 
        !           202:     if (HeaderBufferSize > ETHERNET_HEADER_LENGTH) {
        !           203: 
        !           204:         return NDIS_STATUS_SUCCESS;
        !           205:     }
        !           206: 
        !           207:     //
        !           208:     //  See if there are any pending read that we can satisfy
        !           209:     //
        !           210:     PacketListEntry=ExInterlockedRemoveHeadList(&DeviceExtension->RcvList,
        !           211:                                                 &DeviceExtension->RcvQSpinLock);
        !           212: 
        !           213:     if (PacketListEntry == NULL) {
        !           214:         return NDIS_STATUS_SUCCESS;
        !           215:     }
        !           216: 
        !           217:     pPacket=CONTAINING_RECORD(PacketListEntry,NDIS_PACKET,ProtocolReserved);
        !           218: 
        !           219:     Irp=RESERVED(pPacket)->Irp;
        !           220:     IrpSp = IoGetCurrentIrpStackLocation(Irp);
        !           221: 
        !           222:     //
        !           223:     //  This is the length of our partial MDL
        !           224:     //
        !           225:     BufferLength=IrpSp->Parameters.Read.Length-ETHERNET_HEADER_LENGTH;
        !           226: 
        !           227:     //
        !           228:     //  Find out how much to transfer
        !           229:     //
        !           230:     SizeToTransfer = (PacketSize < BufferLength) ?
        !           231:                        PacketSize : BufferLength;
        !           232: 
        !           233:     //
        !           234:     //  copy the ethernet header into the actual readbuffer
        !           235:     //
        !           236:     NdisMoveMappedMemory(
        !           237:         MmGetSystemAddressForMdl(Irp->MdlAddress),
        !           238:         HeaderBuffer,
        !           239:         HeaderBufferSize
        !           240:         );
        !           241: 
        !           242:     //
        !           243:     //  Call the Mac to transfer the packet
        !           244:     //
        !           245: 
        !           246:     NdisTransferData(
        !           247:         &Status,
        !           248:         DeviceExtension->AdapterHandle,
        !           249:         MacReceiveContext,
        !           250:         0,
        !           251:         SizeToTransfer,
        !           252:         pPacket,
        !           253:         &BytesTransfered);
        !           254: 
        !           255:     if (Status != NDIS_STATUS_PENDING) {
        !           256: 
        !           257:         //
        !           258:         //  If it didn't pend, call the completeion routine now
        !           259:         //
        !           260:         PacketTransferDataComplete(
        !           261:             DeviceExtension,
        !           262:             pPacket,
        !           263:             Status,
        !           264:             BytesTransfered
        !           265:             );
        !           266: 
        !           267: 
        !           268:     }
        !           269: 
        !           270: 
        !           271: 
        !           272:     return NDIS_STATUS_SUCCESS;
        !           273: 
        !           274: }
        !           275: 
        !           276: 
        !           277: VOID
        !           278: PacketTransferDataComplete (
        !           279:     IN NDIS_HANDLE   ProtocolBindingContext,
        !           280:     IN PNDIS_PACKET  pPacket,
        !           281:     IN NDIS_STATUS   Status,
        !           282:     IN UINT          BytesTransfered
        !           283:     )
        !           284: 
        !           285: {
        !           286:     PIO_STACK_LOCATION   IrpSp;
        !           287:     PDEVICE_EXTENSION    DeviceExtension;
        !           288:     PIRP                 Irp;
        !           289:     PMDL                 pMdl;
        !           290: 
        !           291:     IF_LOUD(DbgPrint("Packet: TransferDataComplete\n");)
        !           292: 
        !           293:     DeviceExtension= (PDEVICE_EXTENSION)ProtocolBindingContext;
        !           294:     Irp=RESERVED(pPacket)->Irp;
        !           295: 
        !           296:     IrpSp = IoGetCurrentIrpStackLocation(Irp);
        !           297: 
        !           298:     pMdl=RESERVED(pPacket)->pMdl;
        !           299: 
        !           300:     //
        !           301:     //  Free the MDL that we allocated
        !           302:     //
        !           303:     IoFreeMdl(pMdl);
        !           304: 
        !           305:     //
        !           306:     //  recylcle the packet
        !           307:     //
        !           308:     NdisReinitializePacket(pPacket);
        !           309: 
        !           310:     //
        !           311:     //  Put the packet on the free queue
        !           312:     //
        !           313:     ExInterlockedInsertTailList(
        !           314:         &DeviceExtension->FreePacketList,
        !           315:         &RESERVED(pPacket)->ListElement,
        !           316:         &DeviceExtension->FreePacketListSpinLock);
        !           317: 
        !           318: 
        !           319:     Irp->IoStatus.Status = Status;
        !           320:     Irp->IoStatus.Information = BytesTransfered+ETHERNET_HEADER_LENGTH;
        !           321:     IoCompleteRequest(Irp, IO_NO_INCREMENT);
        !           322: 
        !           323: 
        !           324:     return;
        !           325: 
        !           326: 
        !           327: }
        !           328: 
        !           329: 
        !           330: 
        !           331: 
        !           332: 
        !           333: 
        !           334: 
        !           335: 
        !           336: 
        !           337: VOID
        !           338: PacketReceiveComplete(
        !           339:     IN NDIS_HANDLE  ProtocolBindingContext
        !           340:     )
        !           341: 
        !           342: {
        !           343: 
        !           344:     return;
        !           345: 
        !           346: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.