阅读:1358回复:2
请教:包过滤的实现?
现在,已经通过IP找到具体的包了,怎样才能过滤掉?(基于Passthru)
我的思路是只接受不发送,再释放相应资源,可行吗? 希望众大虾指条明路!!! 还有一个问题 LookAheadBuffer与Packet中的数据是什么关系? 我通过IP过滤相应的包,还要考虑LookAheadBufferSize和PacketSize的大小吗? |
|
|
沙发#
发布于:2003-05-13 20:51
看看本站前面的帖子,会很有帮助! |
|
板凳#
发布于:2003-05-16 20:51
这是胡老大的回答:
再次重复一遍关于返回null的情况。当nic miniport调用 ndisethindicatepacket的时候,ndis就调用协议的ptrecieve, 这个时候会返回null。当nic miniport内存不够的时候,会 设置NDIS_PACKET的flag为ndis_resource然后indicatepacket, 这个时候也会使得ndis调用协议的ptrecieve,但是NdisGetPacket 不会返回null。返回了null说明一个问题,就是nic miniport 不支持或者不在这个包中提供oob data。因此,nic不需要把 一个ndis_packet提交给协议层,只需要提交一些raw data就 行了。这些raw data就在lookaheadbuffer和data里面。 对于返回null,还分2种情况: 一种是提交的数据都包含在ptreceive的入口参数中了,这个时候 协议层判断该包是否属于本协议,例如ip协议判断协议字段是否 是0x800。如果是,协议层负责拷贝这段数据,协议层不能直接 用这些指针构造packet,必须分配一块新内存。 还有一种情况是只有部分数据,协议层同样判断(判断方法同上) 如果协议发现这个包的确属于自己,那么它调用 miniport_transferdata来让nic miniport上传剩下的数据。 我贴的代码就是对这两种情况的处理。ptrecieve共有3种情况, 第一种是NdisGetPacket不返回null,这个passthru已经处理了。 剩下两种情况就是我贴的代码。 这里要说明一点的是,passthru用了一个让初学者郁闷的方法, 当它判断返回null的时候,它直接调用ndisXXXindicatepacket, 这样ip层会判断之后调用imd_transferdata,imd_transferdata 调用miniport_transferdata,对于上层(ip)来说,完美的仿真 了nic的行为,但是对于firewall之类的处理就加大了难度, 我猜想大多数人的郁闷都来源于此。 |
|
|