Bluegulf
驱动牛犊
驱动牛犊
  • 注册日期2007-01-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望25点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
阅读:1636回复:3

PassThru 收包问题!

楼主#
更多 发布于:2007-01-16 22:56
  我在 passthru 收包过程 ptReceivepacket 函数中,读取原来的 packet ,
根据这个 packet 创建了一个新的自己的 packetNew,如何释放申请的内存呢?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-01-18 20:05
1 简单方式 设置标志位,让上层COPY数据。返回后就释放!

2 复杂方式 IF (数据使用完毕) FREE  --> 等待接收会调函数,判断数据报是否是自己申请的,如果是就释放。
走走看看开源好 Solaris vs Linux
Bluegulf
驱动牛犊
驱动牛犊
  • 注册日期2007-01-08
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分240分
  • 威望25点
  • 贡献值0点
  • 好评度24点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-24 22:52
我后来调试过程中在如下的两个位置增加了删除内存操作;
1、ptReceivepacket 函数中根据往上层发送的结果进行是否删除操作;
2、MPReturnPacket 函数中判断是否是自己的数据包,如果是就删除。
ajy
ajy
驱动牛犊
驱动牛犊
  • 注册日期2002-07-09
  • 最后登录2012-12-12
  • 粉丝0
  • 关注0
  • 积分101分
  • 威望20点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于: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后, 这里可就不同了!
游客

返回顶部