frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:3180回复:22

各位dx,我改写的Passthru反映不正常

楼主#
更多 发布于:2004-07-26 20:27
对passthru的MPSend函数进行改写,在发包时增加4个字节的VLAN标签再发送,安装后,发现能能ping通某设备,但是却无法Telnet该设备(该设备Telnet服务正常),为什么?谢谢!

[编辑 -  7/26/04 by  frog_huang]
canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-27 08:18
你是在哪个层上添加的字节?我认为在接收时也应能相应地将这4个字节去掉才行吧。
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-27 09:42
To canoe982:
谢谢你的回。我在中间层的MPSend函数(就是Passthru例子里带的)加VLAN的。没错,在接收的代码是去掉VLAN的,现在的问题是PtReceive和PtReceivePacket这两个函数都没有被调用到啊,而包的确都发出去了。目前的问题是:可以ping通,甚至可以文件拷贝,就是无法进行Telnet。但是一旦不加VLAN就OK了。难道与网卡有关吗?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-27 11:56
1.对方是否支持VLAN
2。你是在自己处理VLAN协议吗,为什么不利用系统自带的VLAN支持,只要Hook Miniport的OID_GEN_MAC_OPTIONS,添加上NDIS_MAC_OPTION_8021P_PRIORITY和 NDIS_MAC_OPTION_8021Q_VLAN,然后在MPSendPackets中NDIS_PER_PACKET_INFO_FROM_PACKET( NdisPacket, Ieee8021QInfo )得到VLAN然后添加到包中,Receive中正好相反
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-27 12:36
对方支持VLAN的,否则我连ping都ping不通。至于你说让系统来做,
问题是我发现并不是所有的网卡都支持VLAN操作啊,所以我只好自己做,每当从上层通过调用MPSend后,我就加上VLAN(4个字节),然后再发出去,接受刚好相反。但就是ping协议是没有问题,Telnet协议就是不行,其他的如文件copy啊等等也都没有问题。怪!!
canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-27 13:55
ftp、HTTP协议均可以吗?
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-07-27 15:03
不可以
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-27 15:09
既然你用了IMD,可以使的上层的协议看起来下层的网卡是支持VLAN不就可以了嘛,只不过所有的网卡应该做的VLAN操作都在你的IMD做了罢了。而你现在的做法相当于上层的协议压根就不知道有VLAN存在,不知道这是不是你无法使用L5协议的原因。
   还有就是不知道你考虑MTU了没,如果是你自己添加VLAN,那你应该把网卡向NDIS报告的MTU减去4个字节,为你的VLAN Tag保留空间。

[编辑 -  7/27/04 by  bingjie]
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-27 15:24
上层不需要知道VLAN的存在,因为VLAN本身在数据链路层。另外,长度也考虑过了,要不我怎么能ping通呢?你说呢?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-27 15:49
另外,长度也考虑过了,要不我怎么能ping通呢?你说呢?

默认情况下Ping的包的很小,只有32字节,不会达到MTU的大小的,所以总是能Ping通的。使用ping x.x.x.x -l 65500 试试
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-27 16:35
To bingjie:
你说的有道理,现在ping *.*.*.* -l 1469机器就重启了,而ping *.*.*.* -l 1468的确不重启
那应该如何“把网卡向NDIS报告的MTU减去4个字节”呢?
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-27 17:21
在PTRequestComplete中,在调用NdisMQueryInformationComplete之前,首先判断OID如果为 OID_GEN_MAXIMUM_FRAME_SIZE或OID_GEN_MAXIMUM_TOTAL_SIZE,则将NdisRequest->DATA.QUERY_INFORMATION.InformationBuffer中的值减去4即可
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-07-27 19:49
To bingjie:
按照你说的方法, ping *.*.*.* -l 1469 现在不重启了,不过,ping不通,而小于等于1468的值可以仍然可以ping。而最关键的问题Telnet仍然不行。why?
另外,Ieee8021QInfo 方法行不通,可能与我用的NDIS版本有关,没有定义。(按说是在NDIS.h里有定义,可我用的版本没有该定义)
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-28 10:12
这个就比较棘手了,实际上目前的做法你只是对发送的MTU做了限制,但没有对接收的MTU进行限制,这样包含了VLAN的超过了网卡实际MTU的PACKET将不被网卡接收,导致你仍然ping不通,Telnet连不上是正常的,应为它也可能发送达到MTU的包。去看看TCP/IP协议中关于最大路径发现的文章,想办法解决这个问题。我想有一个办法就是Hook所有接收到的IP包,当发现IP包的长度超过了MTU-4(1496)并且在Flag中标识了不可分段,则把这个包丢弃,并且要生成一个ICMP差错报文(“需要进行分片但设置了不分片比特”),这样也许能解决这个问题。或者还有一个办法就是把底层的网卡设置为混杂模式,在你的IMD中对包就行过滤,也许这样底层的网卡就不会丢弃超过它的MTU的包,但这完全依赖于底层网卡的实现,并且很有可能收到被截短的包。
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-07-28 10:41
问题是我用sniffer分析后,发现Telnet的包都是小包啊(一开始进行TCP建链的那种包),远没有到MTU呢。可以肯定的是这些包是发处去(用sniffer分析到),而且对端设备的接收端和发送端都没有问题,同时,我的PtReceive或PtReceive都居然没有被调用到(当然前面已经说过了ping小包没有问题,所以arp包也肯定没有问题),因此,我只能怀疑我的发送端有问题,但说问题,为什么ping包又可以?晕~
canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-07-28 10:55
你在发送端和接收端都能用sniffer捕获到Telnet的数据包吗?如果都能,可以看看是否满足Telnet协议要求。
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-07-28 11:05
我在启动同一个网卡上分别做了两件事情:一个VLAN功能未启动,一个VLAN功能启动,然后抓发出去的包,两种情况下,sniffer只看到除了一个有VLAN tag标志不同外,还有IP包标志,检验和、TCP初始序列号不同,而这些不同算是正常情况。其他字段都一样!
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-07-29 08:54
大家继续顶啊
canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-07-29 19:19
能抓到接收的包吗?如果能,格式是什么样子的?
我觉得可能是应用层无法识别自己的端口。
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
frog_huang
驱动牛犊
驱动牛犊
  • 注册日期2002-06-05
  • 最后登录2008-05-02
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-07-30 08:46
你说的“应用层无法识别自己的端口”应该是指Telnet服务端的端口吗?要跟踪似乎有点麻烦,我正在想办法,除此之外还有其他的可能性否?谢谢!
上一页
游客

返回顶部