阅读:1182回复:2
问有关ptreceive的问题
我现在网卡要调用ptreceive来收取包,实际应该是不能直接获得完整的包,我现在想获得完整的包内容。
1,首先,对于packetsize==lookaheadbuffersize的情况,我直接拷贝了headbuffer和lookaheadbuffer,生成包描述符,然后组成包,但是我不知道如何填写带外信息。 2,然后,对于packetsize>lookaheadbuffersize的情况,我想直接拷贝headbuffer内容到一个buffer,生成包描述符packet,连接buffer到packet上,然后从偏移0循环调用ndistransferdata,希望可以获得完整包,并且是用packet来描述的, 现在,这两个动作我都不正确,其中第2部分还会进入无休止的死循环(就是ndistransferdata不能成功使packet获得完整的包内容),但我不知道应该如何改正,希望各位能够帮忙给些意见,出一些比较详细的解决方案。 谢谢。 |
|
|
沙发#
发布于:2004-03-08 12:54
1、如果低层NIC驱动程序指示OOB数据,那么中间层驱动程序在ProtocolReceive处理中必须以NIDS_GET_ORIGINAL_PACKET为参数调用NdisGetReceivePacket找到这些信息,但不总是有的。
2、然后从偏移0循环调用ndistransferdata是何意思, 你还是参考以下吧,(节选) else // 如果 LookAheadBuffer 中没有包含全部数据 { // 分配内存 pPacketContent,存放要传输的除 LookAheadBuffer 之外的数据。 Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint("PtReceive:NdisAllocateMemory Failed.\n"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pPacketContent==NULL) { DbgPrint("PTReceive:pPacketContent==NULL\n"); return(NDIS_STATUS_NOT_ACCEPTED); } NdisZeroMemory(pPacketContent,BUFFER_SIZE); // 分配包描述符 MyPacket。 NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); // 分配内存 pBakContent,存放HeaderBuffer + LookAheadBuffer。 Status = NdisAllocateMemory(&pBakContent, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint("PtReceive:NdisAllocateMemory Failed.\n"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pBakContent == NULL) { DbgPrint("PTReceive:pPacketContent==NULL\n"); return(NDIS_STATUS_NOT_ACCEPTED); } // 将 HeaderBuffer + LookAheadBuffer 复制到 pBakContent 指向的内存中。 NdisZeroMemory(pBakContent, BUFFER_SIZE); NdisMoveMemory(pBakContent, HeaderBuffer, HeaderBufferSize); NdisMoveMemory(pBakContent+HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize); PacketLen = HeaderBufferSize + PacketSize; // 为要传输的除 LookAheadBuffer 之外的数据分配缓冲描述符(该缓冲描述符与 pPacketContent 指向的内存关联)。 NdisAllocateBuffer(&Status, &pPacketBuffer, pAdapt->RecvBufferPoolHandle, pPacketContent, PacketSize-LookAheadBufferSize); // 关联包描述符 MyPacket 与缓冲描述符 pPacketBuffer。 NdisChainBufferAtFront(MyPacket, pPacketBuffer); MyPacket->Private.Head->Next=NULL; MyPacket->Private.Tail=NULL; OffsetSize = HeaderBufferSize + LookAheadBufferSize; // 分配包描述符 MyPacket1。 NdisDprAllocatePacket(&Status, &MyPacket1, pAdapt->RecvPacketPoolHandle); // 分配缓冲描述符 pBakBuffer,与 pBakContent 指向的内存关联。 NdisAllocateBuffer(&Status, &pBakBuffer, pAdapt->RecvBufferPoolHandle, pBakContent, OffsetSize); // 关联包描述符 MyPacket1 与缓冲描述符 pBakBuffer。 NdisChainBufferAtFront(MyPacket1, pBakBuffer); Rsvd = (PRSVD)(MyPacket->MiniportReserved); Rsvd->OriginalPkt = (PNDIS_PACKET)MyPacket1; NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); // 取得 LookAheadBuffer 之后的数据 NdisTransferData(&Status, pAdapt->BindingHandle, MacReceiveContext, LookAheadBufferSize, // 数据起始地址 PacketSize-LookAheadBufferSize, // 字节数 MyPacket, &BytesTransferred); if(Status != NDIS_STATUS_PENDING) { PtTransferDataComplete((NDIS_HANDLE)pAdapt, MyPacket, Status, BytesTransferred); } break; } |
|
板凳#
发布于:2004-03-08 12:55
注意PtTransferDataComplete的调用
|
|