阅读:1636回复:3
PassThru 收包问题!
我在 passthru 收包过程 ptReceivepacket 函数中,读取原来的 packet ,
根据这个 packet 创建了一个新的自己的 packetNew,如何释放申请的内存呢? |
|
沙发#
发布于:2007-01-18 20:05
1 简单方式 设置标志位,让上层COPY数据。返回后就释放!
2 复杂方式 IF (数据使用完毕) FREE --> 等待接收会调函数,判断数据报是否是自己申请的,如果是就释放。 |
|
|
板凳#
发布于:2007-01-24 22:52
我后来调试过程中在如下的两个位置增加了删除内存操作;
1、ptReceivepacket 函数中根据往上层发送的结果进行是否删除操作; 2、MPReturnPacket 函数中判断是否是自己的数据包,如果是就删除。 |
|
地板#
发布于:2007-02-05 01:51
to cyliu:
说了等于没说! "passthru 收包过程 ptReceivepacket 函数中,读取原来的 packet , 根据这个 packet 创建了一个新的自己的 packetNew,如何释放申请的内存呢?" 这个过程在passthru里写的很清楚. 当调用NdisMIndicateReceivePacket()上指一个packet后有以下一段代码: if (Status == NDIS_STATUS_RESOURCES) { // // Our ReturnPackets handler will not be called for this packet. // We should reclaim it right here. // NdisDprFreePacket(MyPacket); } 这段代码很值得研究. 具体这样使用的原因就不说了, (当然也可能是我说的不太清楚).但结果是如果程序能执行的if语句里的话, 下层miniport应该是一个非串行的小端口, 而且这时MyPacket的内容已经被上层的protocol处理过并返回了. 如果不是if里的情况呢, 看MPReturnPacket()里的代码: if (NdisGetPoolFromPacket(Packet) != pAdapt->RecvPacketPoolHandle) { // // We reused the original packet in a receive indication. // Simply return it to the miniport below us. // NdisReturnPackets(&Packet, 1); } else #endif // NDIS51 { // // This is a packet allocated from this IM's receive packet pool. // Reclaim our packet, and return the original to the driver below. // PNDIS_PACKET MyPacket; PRECV_RSVD RecvRsvd; RecvRsvd = (PRECV_RSVD)(Packet->MiniportReserved); MyPacket = RecvRsvd->OriginalPkt; NdisFreePacket(Packet); NdisReturnPackets(&MyPacket, 1); } 从注释中我们可以看的很清楚应该走的是else部分,释放掉这个packet,然后返回MyPacket. 这个MyPacket名字似乎有问题, 因为它并不是"我的"packet, 而是属于下层的. 可是不是所有在这里接收的packet都要return呢, 这是另外一个问题. 对于passthru里这样做是对的, 可是你要修改了ptreceive调用ndistransferdata后, 这里可就不同了! |
|