cross_sky
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2012-09-07
  • 粉丝0
  • 关注0
  • 积分858分
  • 威望727点
  • 贡献值0点
  • 好评度77点
  • 原创分0分
  • 专家分0分
阅读:1645回复:10

关于协议驱动的包描述符

楼主#
更多 发布于:2005-06-17 17:57
    小弟在协议驱动绑定网卡时分配了包描述符和缓冲区描述符,并用NdisChainBufferAtBack将缓冲区描述符连接到包描述符,然后在NdisIndicate函数中收到下层NIC驱动指示一个包时用NdisTansferDada将数据包拷贝到我自己定义的一个NDIS_PACKET类型的变量时出现一个PAGE FAULT,不知是怎么回事,是不是我自己想要复制数据包只能使用NDIS_PACKET结构中的PacketReserved部分,恳请高手指点,不胜感激!一定给分谢谢!
sky
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-06-17 18:57
可以看看ddk中的ndisuio的接收数据包的处理。
cross_sky
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2012-09-07
  • 粉丝0
  • 关注0
  • 积分858分
  • 威望727点
  • 贡献值0点
  • 好评度77点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-06-17 19:30
   我看的是DDK中NDIS的packet例子,感觉这个例子不实用,按照它的规范传输速率很慢,还不如正常的如FTP协议快。不知是不是我哪里没做好?
sky
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-06-17 19:41
packet的例子是2k ddk的吧?建议看看xp ddk的ndisuio的例子,packet的例子怎么实现的已经没有印象了
cross_sky
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2012-09-07
  • 粉丝0
  • 关注0
  • 积分858分
  • 威望727点
  • 贡献值0点
  • 好评度77点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-17 20:15
呵呵,谢谢zhaock大虾
sky
cross_sky
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2012-09-07
  • 粉丝0
  • 关注0
  • 积分858分
  • 威望727点
  • 贡献值0点
  • 好评度77点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-18 10:41
packet的例子是2k ddk的吧?建议看看xp ddk的ndisuio的例子,packet的例子怎么实现的已经没有印象了


是不是packet本身的机制就不能满足高速的要求阿,希望有经验的大虾指点一下
sky
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2005-06-18 12:19
你目前遇到的是什么问题?xp ddk后已经用ndisuio取代了packet的例子,建议直接用ndisuio的例子,不要再用packet了。packet没有缓存,可能会丢包,不是效率的问题,是缓存的问题
cross_sky
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2012-09-07
  • 粉丝0
  • 关注0
  • 积分858分
  • 威望727点
  • 贡献值0点
  • 好评度77点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-18 19:27
下面是引用zhaock于2005-06-18 12:19发表的:
你目前遇到的是什么问题?xp ddk后已经用ndisuio取代了packet的例子,建议直接用ndisuio的例子,不要再用packet了。packet没有缓存,可能会丢包,不是效率的问题,是缓存的问题

就是丢包,而且我想用这个协议来传送速据,需要高速,比如一个1000M的网卡,希望能做到六七百兆的速率。
sky
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2005-06-19 08:38
ndishio有缓寸处理,一般就不会丢包了.你应该采用DIRECT IO的方式,尽量减少内存的复制,测试一下,看看能达到多少,如果不能满足你的要求,再来考虑如何进一步优化
cross_sky
驱动小牛
驱动小牛
  • 注册日期2004-06-17
  • 最后登录2012-09-07
  • 粉丝0
  • 关注0
  • 积分858分
  • 威望727点
  • 贡献值0点
  • 好评度77点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-06-22 18:27
下面是引用zhaock于2005-06-19 08:38发表的:
ndishio有缓寸处理,一般就不会丢包了.你应该采用DIRECT IO的方式,尽量减少内存的复制,测试一下,看看能达到多少,如果不能满足你的要求,再来考虑如何进一步优化

       首先感谢zhaock大哥!      
       这里的缓存是指的驱动分配的一段内存,然后连接到包描述符的吧,Ndisuio里面就是这样用的,它好像是在包描述符的头和尾都连接了缓冲区,再把数据从驱动分配的缓冲区复制到应用程序传递进来的内存,这两个缓冲区交替使用是吗?而Packet驱动里面连接到包描述符的缓冲区是应用程序传进来的内存,是不是因为这样所以会丢失数据?我的感觉是当驱动处理读I/O请求时没有及时的把IRP连接到队列里面,这样在ReceiveIdicate函数里面就可能没有需要的缓冲区来复制数据,于是数据就丢失了。
     另外我还有一个问题,是不是在一个包描述符上链接多个缓冲区接收到的数据就可以一直往这个包描述符的缓冲区里面复制呢?
     如果我用完一个包描述符不释放它而是重新初始化是不是也会提高速度?
     再次感谢!
sky
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2005-06-22 20:34
packet的处理是如果没有读irp在等待,就丢包了。
ndisuio会对网络来包,进行排队,即使这时候没有读irp在等待,也不会丢包。
你可以只参考ndisuio就可以了,没有必要再分析packet 的代码了。

>>是不是在一个包描述符上链接多个缓冲区接收到的数据就可以一直往这个包描述符的缓冲区里面复制呢?
不是,一个缓冲区就够了,多了也没有必要
>>如果我用完一个包描述符不释放它而是重新初始化是不是也会提高速度?
会提高速度,要区分ndis_packet的分配,ndis_buffer的分配,和真正内存buffer的分配之间的关系
游客

返回顶部