zhizl
驱动牛犊
驱动牛犊
  • 注册日期2001-05-18
  • 最后登录2002-07-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1627回复:6

Multiple packets indicate and using NdisReinitilizePacket(? ???

楼主#
更多 发布于:2001-12-30 16:57
Dear Ndis driver guru:

关于多包指示和 NdisReinitailizePacket( 与各位探讨一下, Packet 定义成数组, 只重用时不用释放(为了避免每次使用都要allocate & free.), 这样做法有没有问题, 或者有无更好的方法??

以下是实现方法:
在初始化阶段, 作以下处理...
 NdisAllocatePacketPool(?
 NdisAlocateBufferPool(?
 然后建立Packet array and Buffer array...
 这里注意的是, 这里指建立数组而不chain, 不过我看rtl8139 and sis sample, 他们多直接在这里建链. 而在int 之dpc中只填充数据而不再chain.

数据处理过程:
  填充buffer 数据..NdisMoveMemory(?
  调整实际长度, NdisAdjustBufferLength( ?
  建链 NdisChainBufferAtBack(?
  设置包状态 NDIS_SET_PACKET_STATUS(pkt_desr, NDIS_STATUS_RESOURCES);
  积累packet到八个, 启动Timer, 在Timer之DPC routine 中指示。

Timer 之dpc routine:
 NdisIndicateReceivePacket(...每八个indicate一次
 检查包的状态 Ndis_Get_Packet_status(?
 if == pending
   NdisUnchainBufferAtFront( RevPacket, &Mybuffer );
   NdisReinitializePacket( RevPacket );
 end.

我的疑问是这样使用可以吗, 有没有更好的方法?

Thanks for your help!


MiniportReturnPacket 也作上述处理:
  NdisUnchainBufferAtFront( Packet, &MyBuffer);
  NdisReinitializePacket( Packet );
不过我跟踪过, 从来没有到达过MiniportReturnPacket中.








  
_____________________________ 虽然我不同意你的意见,但我坚决捍卫您发表意见的权利!!!
mister
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2013-02-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望26点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-12-30 20:45
我也想问一个问题:
ddk documention中说明:在调用Ndisadjuestbufferlength后在调用Ndisfreememory前必须再调用ndisadjustbufferlength把长度设为初始调用时的。
我想问:在调用ndisadjustbufferlength时,我该把原始长度放在什么地方比较合适?在将来释放内存时好找回原始长度。
zhizl
驱动牛犊
驱动牛犊
  • 注册日期2001-05-18
  • 最后登录2002-07-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-30 22:00
原始长度你可定义成一大线性缓冲,以一个指针来跟踪。
Example; NdisAllocateMemory(
(PVOID *)&pAdapter->rx_bufs,
RX_BUF_SIZE * NUM_OF_PACKETS, // 1514 * 0x40
0,//not cached
HighestAcceptableAddress );
以一个指针 cur_rx 来跟踪 现在正在操作 which one buffer?

你问的是这个吗?
_____________________________ 虽然我不同意你的意见,但我坚决捍卫您发表意见的权利!!!
mister
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2013-02-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望26点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-12-31 08:42
也就是我的所有数据包的缓冲区的长度都定义成固定的有一定容量的长度(比如:1514*0x40),是这样吗?
zhizl
驱动牛犊
驱动牛犊
  • 注册日期2001-05-18
  • 最后登录2002-07-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-12-31 15:16
是啊。 你可以如斯AllocateBuffer, 在填充数据时 AdjustLength 就可以了。

Maybe help u.
_____________________________ 虽然我不同意你的意见,但我坚决捍卫您发表意见的权利!!!
mister
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2013-02-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望26点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-12-31 15:24
I see.Thank you.
mister
驱动牛犊
驱动牛犊
  • 注册日期2001-11-25
  • 最后登录2013-02-26
  • 粉丝0
  • 关注0
  • 积分8分
  • 威望26点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-12-31 15:38
下面还有一个问题请教:
1).在例程ptReceivePacket中若返回一个非0值(如返回N),那么表示当上层调用NdisReturnPackets这个包N次后NDIS便会调用本层的MiniportReutrnPackets以表示本层获得了这个包的所有权。
2).DDK中关于函数NdisInidecatePackets的说明是,当某个包返回是NDIS_STATUS_PENDING时,本层便失去了这个包的所有权,当上层调用NdisReturnPackets时,本层实行MiniportReturnPackets时才又重新获得这个包的所有权。

问:
1。2)中上层调用NdisReturnPackets几次才会调用本层的MiniportReturnPackets呢?
2。若在1)的情况中发生2)的情况,即在例程ptReceivePacket中调用NdisIndicatePackets时,上层该调用几次NdisReturnPackets呢?
游客

返回顶部