arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1579回复:13

菜鸟问问题

楼主#
更多 发布于:2003-09-29 19:12
在passthru,怎么自己构造一个packet发送出去呢?
有什么需要注意的地方?

我的做法:
在PtReceive,检查到特定IP,比如是192.168.3.33(限于局域网),我就向对方发一个UDP的包:
1、先分配64bytes的buffer,按ethernet header、ip header、udp header的次序添内容,剩余的就为0。ethernet header的目标、源hardware地址对调,类型设置为IP;ip header的IP地址也对调(这里我觉得不用关心了吧,既然是局域网,把ethernet header的地址一改。。。),长度、校验和,protocol type设为UDP(17);udp header用两个没有用的端口号,长度,校验和为0(不用它)
2、NdisAllocateBuffer
3、NdisAllocatePacket,NdisChainBufferAtFront
4、因为passthru用到了pRsvd->OriginalPkt(在PtSendComplete),我将之设为NULL,并在PtSendComplete判断,不是NULL才处理
5、设置NDIS_FLAGS_DONT_LOOPBACK,和HeaderBufferSize(用的是输入参数HeaderBufferSize)
6、NdisSend,不为PENDING的话,free memory等

上手不久,不知道还有什么应该注意的地方。因为发出去不久就BSOD了。。。是网卡的sys出错了。应该还是包有问题。
在PtSendComplete下了断点的,并没有被调用。

看了一段时间的帖子,还没有看到关于IMD如何自己发个packet的,只好来问问了。


[编辑 -  9/30/03 by  arthurtu]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-09-29 20:19
刚刚看见hu版,他就走了。。。
bobo_lei
驱动牛犊
驱动牛犊
  • 注册日期2003-03-26
  • 最后登录2008-11-16
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望14点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-09-29 22:25
在MPsend啊
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-09-30 00:17
晚上了,自己没有说清楚。明天整理一下。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-09-30 12:55
在passthru,怎么自己构造一个packet发送出去呢?
有什么需要注意的地方?

我的做法:
在PtReceive,检查到特定IP,比如是192.168.3.33(限于局域网),我就向对方发一个UDP的包:
1、先分配64bytes的buffer,按ethernet header、ip header、udp header的次序添内容,剩余的就为0。ethernet header的目标、源hardware地址对调,类型设置为IP;ip header的IP地址也对调(这里我觉得不用关心了吧,既然是局域网,把ethernet header的地址一改。。。),长度、校验和,protocol type设为UDP(17);udp header用两个没有用的端口号,长度,校验和为0(不用它)

2、NdisAllocateBuffer
//这个之前要申请和MEMORY,把虚拟地址传给BUFFER,
//BUFFER,实际上是个MDL,晕,你怎么犯这种错误??




3、NdisAllocatePacket,NdisChainBufferAtFront
4、因为passthru用到了pRsvd->OriginalPkt(在PtSendComplete),我将之设为NULL,并在PtSendComplete判断,不是NULL才处理
5、设置NDIS_FLAGS_DONT_LOOPBACK,和HeaderBufferSize(用的是输入参数HeaderBufferSize)
6、NdisSend,不为PENDING的话,free memory等

上手不久,不知道还有什么应该注意的地方。因为发出去不久就BSOD了。。。是网卡的sys出错了。应该还是包有问题。
在PtSendComplete下了断点的,并没有被调用。

看了一段时间的帖子,还没有看到关于IMD如何自己发个packet的,只好来问问了。


[编辑 -  9/30/03 by  arthurtu]
:D
放弃瘟草,现吃李草
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-09-30 13:17
1、先分配64bytes的buffer


 


冤枉我嘛,我分配了的。:D
NdisAllocateMemory, 64bytes的
然后NdisAllocateBuffer,
再是NdisAllocatePacket
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-09-30 13:49
[quote]1、先分配64bytes的buffer


 


冤枉我嘛,我分配了的。:D
NdisAllocateMemory, 64bytes的
然后NdisAllocateBuffer,
再是NdisAllocatePacket [/quote]

那么的你的IPHEADER,UDPHEADER,等等是按一个BYTE对齐的吗?
#pragma pack(push,1)
//你结构体的定义
#pragma pack(pop)
//联系打字ing ,houhou
放弃瘟草,现吃李草
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-09-30 13:51
忽然想到可能的原因了,在判断NdisSend返回值时候,不是PENDING,释放packet,buffer,memory,然而是pending的时候,我也free buffer和memory了,不蓝才怪呢。应该到PtSendComplete去free。
呵呵,看样子还是要休息好,头脑才清醒啊。 :D
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-09-30 13:56
[quote][quote]1、先分配64bytes的buffer


 


冤枉我嘛,我分配了的。:D
NdisAllocateMemory, 64bytes的
然后NdisAllocateBuffer,
再是NdisAllocatePacket [/quote]

那么的你的IPHEADER,UDPHEADER,等等是按一个BYTE对齐的吗?
#pragma pack(push,1)
//你结构体的定义
#pragma pack(pop)
//联系打字ing ,houhou  [/quote]
嗯,这个忘了。
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-09-30 13:59
debug的时候,没有发现对齐的问题,可能是我没有注意。加上加上。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-09-30 14:02
楼上,国庆快乐的说!
你宝贝女儿,在家乖不乖?
//你好幸福 :D
放弃瘟草,现吃李草
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
11楼#
发布于:2003-09-30 14:17
楼上,国庆快乐的说!
你宝贝女儿,在家乖不乖?
//你好幸福 :D

乖乖的,谢谢。不过她现在不理我了,都不让我抱,唉。
也祝你国庆快乐 ;)

再问个问题,DDK说,分配packet的时候,at least, 16 bytes of ProtocolReserved space ,就是说 ProtocolReserved 是指向一个16bytes的space的?我不太确认。
antspower
驱动中牛
驱动中牛
  • 注册日期2002-10-17
  • 最后登录2010-08-03
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值2点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-09-30 15:16
ProtocolReserved 确实是个16字节的UCHAR 数组
可是我不明白 ProtocolReserved到底有什么作用?

放弃瘟草,现吃李草
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
13楼#
发布于:2003-09-30 15:44
ProtocolReserved 确实是个16字节的UCHAR 数组
可是我不明白 ProtocolReserved到底有什么作用?

 

呵呵,我的理解是给IMD(protocol一端)自己用的。你看passthru,在MPSend的时候,自己allocate一个packet,将旧的地址存放到ProtocolReserved,然后把新包send。
等send complete,在PtSendComplete,他又把旧包地址从取ProtocolReserved取出来,free 新包,调用NdisMSendComplete,应该是又调用上层的sendComplete去了。自己随便用,反正就那么大的地方。
游客

返回顶部