anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
阅读:1713回复:9

网卡收帧的问题

楼主#
更多 发布于:2005-07-17 15:02
  我做了一个虚拟网卡驱动程序
在跟应用程序同许的一块
网卡发帧都能发到应用程序中

现在的问题是应用程序把数据发到网卡的驱动中,
怎么在驱动中产生网卡收到帧的信号并通知上层
协议来取数据呢

我在驱动里是直接调用
NdisMIndicateReceivePacket()
但好像不行

我们做的是虚拟vpn
两台机子都装了虚拟网卡 在同一个虚拟局域网下
在其中一台机子ping另一台机子时候

被ping的那台机子都收到了arp请求帧
调试的时候也到了驱动的调用NdisMIndicateReceivePacket语句
但是被ping的这台机子就是不会发arp应答帧
所以我觉得可能是NdisMIndicateReceivePacket()没有通知到上层协议

求高手指点
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2005-07-17 15:38
调用NdisMIndicateReceivePacket没有问题,检查一下参数,确认一下tcpip.sys确实 绑定到了你的miniport
anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-17 15:52
怎么确定tcpip.sys绑定到虚拟网卡的miniport上了呢?
要在驱动你做什么么?

用ping命令的时候
系统会调用我这张虚拟网卡驱动的send函数的
系统发的帧也能取到
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2005-07-17 19:27
既然调用了你的send函数,就说明已经tcpip已经绑定到你的miniport driver了。
那就没有道理NdisMIndicateReceivePacket出问题了,是不是你的包不对,被tcpip抛弃了。
你的问题描述的不清楚,可以详细的描述一下,你从1号pc 发ping包到2号pc,包的流动顺序,现在是在哪个环节
出了问题?
anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-19 21:39
现在出了新毛病

就是从PC1 ping PC2, PC2对PC1的arp广播帧做出了答复,PC1也收到了PC2的arp应答帧,但是PC1的高层协议就是不会产生发应。
如果从PC2 ping PC1, PC1收到了PC2的arp广播,但是PC1的高层也不做出应答。
所以, 我觉得是PC1的网卡驱动不会吧收到的数据帧反馈到高层协议。

但是,有一点我想不懂的是, 两天机子用的是相同的客户端,相同的驱动,而且虚拟网卡的配置,只有IP地址和mac地址不一样。

真是快疯了 找不出原因。
下面是我网卡与客户端交互的代码(客户端向网卡发出一个控制命令,使网卡驱动来取数据,并产生一个收包信号:


case VNIC_IOCTL_WRITEFRAME:
                                          //TODO: 写帧
                                          {      
                                                 PUCHAR in = (PUCHAR)I.IoctlBuffer();
              
                                                 //指定堆栈为当前堆栈
                                                 EStackLocation s = CURRENT;
                                                 //获取输入缓冲区的长度
                                                 UINT size = I.IoctlInputBufferSize(s);

                                                 for(UINT i = 0; i<size; i++)
                                                 {
                                                        recData[ i ] = in[ i ];
                                                 }

                                                
                                                 //转换成网卡接受的帧
                                                
                                                 //释放原先的内存
                                                 if(recPkt.IsValid())
                                                 {
                                                        pktPool.Free(PNDIS_PACKET(recPkt));
                                                 }
                                                 if(recBuf.IsValid())
                                                 {
                                                        bufPool.Free(PNDIS_BUFFER(recBuf));
                                                 }

                                                 //定义一个用于接收的包
                                                 recPkt = pktPool.Allocate();
                                                 recBuf = bufPool.Allocate(recData, size);

                                                 recPkt.ChainAtBack(PNDIS_BUFFER(recBuf));
                                                
                                                
                                                 //产生一个收包信号
                                                 if(pAdapter != NULL)
                                                 {
                                                        //pAdapter是指向当前Adapter的指针
                                                        pAdapter->IndicateReceive(PNDIS_PACKET(recPkt));
                                                        pAdapter->m_GenStats->rcv_ok++;
                                                 }
                                                 else
                                                 {
                                                        TRACE("recive packet failed!");
                                                 }
                                          

                                          }

                                          break;
anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-07-19 21:48
每次在PC1上调试
收帧的时候都调用了pAdapter->IndicateReceive(PNDIS_PACKET(recPkt));
但是PC1就是不响应。
IndicateReceive调用的是KNdisMiniAdapter的成员函数,
我看了它的代码,其实调用的是NdisMIndicateReceivePacket()。

还有我在虚拟网卡里关于收帧就做了这么些
还要做其他的么
小弟是初学者, 望前辈们执教啊
现在边上考研辅导班,边做这个东东, 很是痛苦啊!
在这跪球前辈们指点了!!
anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-07-21 21:35
怎么没人回啊?
在线等啊?
xxlangyun
驱动小牛
驱动小牛
  • 注册日期2004-11-22
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分272分
  • 威望58点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-23 10:22
请教ANYLIN一个问题,感觉我们遇到的问题是差不多的,我做USB 网卡驱动,现在为如何在驱动里面不停的收数感到困惑,你能提供点帮助吗?KNdissystemreceivearea这个类如何实现网卡接收数据的?
anylin
驱动牛犊
驱动牛犊
  • 注册日期2005-06-07
  • 最后登录2008-11-04
  • 粉丝0
  • 关注0
  • 积分365分
  • 威望45点
  • 贡献值0点
  • 好评度29点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-07-23 12:19
DriverStudio里有个例子 USBNIC NDIS WDM Miniport Driver (USB NIC)
里面有详细的用法
就是用这个类的
zhaock
驱动太牛
驱动太牛
  • 注册日期2002-01-26
  • 最后登录2018-06-02
  • 粉丝3
  • 关注2
  • 积分73328分
  • 威望362317点
  • 贡献值1点
  • 好评度226点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2005-07-23 16:20
检查一下你虚拟网卡发送给上层协议的数据包的格式,最大可能是格式不对,被抛弃了
游客

返回顶部