阅读:1579回复:13
菜鸟问问题
在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] |
|
沙发#
发布于:2003-09-29 20:19
刚刚看见hu版,他就走了。。。
|
|
板凳#
发布于:2003-09-29 22:25
在MPsend啊
|
|
地板#
发布于:2003-09-30 00:17
晚上了,自己没有说清楚。明天整理一下。
|
|
地下室#
发布于:2003-09-30 12:55
在passthru,怎么自己构造一个packet发送出去呢?:D |
|
|
5楼#
发布于:2003-09-30 13:17
1、先分配64bytes的buffer 冤枉我嘛,我分配了的。:D NdisAllocateMemory, 64bytes的 然后NdisAllocateBuffer, 再是NdisAllocatePacket |
|
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 |
|
|
7楼#
发布于:2003-09-30 13:51
忽然想到可能的原因了,在判断NdisSend返回值时候,不是PENDING,释放packet,buffer,memory,然而是pending的时候,我也free buffer和memory了,不蓝才怪呢。应该到PtSendComplete去free。
呵呵,看样子还是要休息好,头脑才清醒啊。 :D |
|
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] 嗯,这个忘了。 |
|
9楼#
发布于:2003-09-30 13:59
debug的时候,没有发现对齐的问题,可能是我没有注意。加上加上。
|
|
10楼#
发布于:2003-09-30 14:02
楼上,国庆快乐的说!
你宝贝女儿,在家乖不乖? //你好幸福 :D |
|
|
11楼#
发布于:2003-09-30 14:17
楼上,国庆快乐的说! 乖乖的,谢谢。不过她现在不理我了,都不让我抱,唉。 也祝你国庆快乐 ;) 再问个问题,DDK说,分配packet的时候,at least, 16 bytes of ProtocolReserved space ,就是说 ProtocolReserved 是指向一个16bytes的space的?我不太确认。 |
|
12楼#
发布于:2003-09-30 15:16
ProtocolReserved 确实是个16字节的UCHAR 数组
可是我不明白 ProtocolReserved到底有什么作用? |
|
|
13楼#
发布于:2003-09-30 15:44
ProtocolReserved 确实是个16字节的UCHAR 数组 呵呵,我的理解是给IMD(protocol一端)自己用的。你看passthru,在MPSend的时候,自己allocate一个packet,将旧的地址存放到ProtocolReserved,然后把新包send。 等send complete,在PtSendComplete,他又把旧包地址从取ProtocolReserved取出来,free 新包,调用NdisMSendComplete,应该是又调用上层的sendComplete去了。自己随便用,反正就那么大的地方。 |
|