阅读:1713回复:9
网卡收帧的问题
我做了一个虚拟网卡驱动程序
在跟应用程序同许的一块 网卡发帧都能发到应用程序中 现在的问题是应用程序把数据发到网卡的驱动中, 怎么在驱动中产生网卡收到帧的信号并通知上层 协议来取数据呢 我在驱动里是直接调用 NdisMIndicateReceivePacket() 但好像不行 我们做的是虚拟vpn 两台机子都装了虚拟网卡 在同一个虚拟局域网下 在其中一台机子ping另一台机子时候 被ping的那台机子都收到了arp请求帧 调试的时候也到了驱动的调用NdisMIndicateReceivePacket语句 但是被ping的这台机子就是不会发arp应答帧 所以我觉得可能是NdisMIndicateReceivePacket()没有通知到上层协议 求高手指点 |
|
沙发#
发布于:2005-07-17 15:38
调用NdisMIndicateReceivePacket没有问题,检查一下参数,确认一下tcpip.sys确实 绑定到了你的miniport
|
|
板凳#
发布于:2005-07-17 15:52
怎么确定tcpip.sys绑定到虚拟网卡的miniport上了呢?
要在驱动你做什么么? 用ping命令的时候 系统会调用我这张虚拟网卡驱动的send函数的 系统发的帧也能取到 |
|
地板#
发布于:2005-07-17 19:27
既然调用了你的send函数,就说明已经tcpip已经绑定到你的miniport driver了。
那就没有道理NdisMIndicateReceivePacket出问题了,是不是你的包不对,被tcpip抛弃了。 你的问题描述的不清楚,可以详细的描述一下,你从1号pc 发ping包到2号pc,包的流动顺序,现在是在哪个环节 出了问题? |
|
地下室#
发布于: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; |
|
5楼#
发布于:2005-07-19 21:48
每次在PC1上调试
收帧的时候都调用了pAdapter->IndicateReceive(PNDIS_PACKET(recPkt)); 但是PC1就是不响应。 IndicateReceive调用的是KNdisMiniAdapter的成员函数, 我看了它的代码,其实调用的是NdisMIndicateReceivePacket()。 还有我在虚拟网卡里关于收帧就做了这么些 还要做其他的么 小弟是初学者, 望前辈们执教啊 现在边上考研辅导班,边做这个东东, 很是痛苦啊! 在这跪球前辈们指点了!! |
|
6楼#
发布于:2005-07-21 21:35
怎么没人回啊?
在线等啊? |
|
7楼#
发布于:2005-07-23 10:22
请教ANYLIN一个问题,感觉我们遇到的问题是差不多的,我做USB 网卡驱动,现在为如何在驱动里面不停的收数感到困惑,你能提供点帮助吗?KNdissystemreceivearea这个类如何实现网卡接收数据的?
|
|
8楼#
发布于:2005-07-23 12:19
DriverStudio里有个例子 USBNIC NDIS WDM Miniport Driver (USB NIC)
里面有详细的用法 就是用这个类的 |
|
9楼#
发布于:2005-07-23 16:20
检查一下你虚拟网卡发送给上层协议的数据包的格式,最大可能是格式不对,被抛弃了
|
|