阅读:2498回复:8
以太帧和包是什么关系啊,在ptrecieve中接收的是以太帧吗,那NdisMIndicateReceivePacket发出去的是包吗
以太帧和包是什么关系啊,在ptrecieve中接收的是以太帧吗,那NdisMIndicateReceivePacket发出去的是包吗
|
|
沙发#
发布于:2005-06-03 10:57
我的意思是不重新构造PACKET,也不调用NdisMIndicateReceivePacket, 如果你不构造Packet,也不调用NdisMIndicateReceivePacket。而且也不走Passthru的已有的处理NdisMEthIndicateReceive当然就不会被传上去了。 你把qq发到我的邮箱里吧。我也比较忙,人多了,也招呼不过来。呵呵 |
|
板凳#
发布于:2005-06-03 09:37
我的意思是不重新构造PACKET,也不调用NdisMIndicateReceivePacket,
判断完ICMP包后的程序都不写 这样的话,收到的包还会被传上去吗 因为我发现,这个驱动装上以后,我就上不了网了, 我是在PASSTHRU基础上做的,应该是IMD吧 如果您方便的话,希望您能给我个QQ什么的, |
|
地板#
发布于:2005-06-02 22:02
我用DDK中的方法,收到的包都是NULL,所以不能用这种啊! 1。你可能是看的是PtReceive,去获得Packet,为空吧?但直接看LookAside的数据就行了。 2。判断出ICMP包后的这段程序的就是自己如何组一个Packet,通知 上层协议,需要你理解先NDIS_PACKET,NDIS_BUFFER的结构和关系, 再看这段代码就没有任何问题了 如果你采用的是ddk的imd驱动的代码,它的处理就都是往上传 |
|
地下室#
发布于:2005-06-02 17:03
我用DDK中的方法,收到的包都是NULL,所以不能用这种啊!
判断出ICMP包后的这段程序不是很理解,希望能帮我解释一下, 假如我不写这段程序,这个包是不是就默认的被传上去了呀? |
|
5楼#
发布于:2005-06-01 19:27
因为调用了NdisMIndicateReceivePacket,所以就需要构造一个Packet结构出来。这个程序效率不高,实际上完全可以避免内存拷贝。
你可以看ddk中的Passthru的例子的实现,就可以不需要构建新的Packet,也不需要内存拷贝。 |
|
6楼#
发布于:2005-06-01 17:27
为什么pPacketContent中已经有数据了,
还要弄个MyPacket的东东啊? |
|
7楼#
发布于:2005-06-01 15:54
if(FALSE){}
else if(PacketSize <= LookAheadBufferSize) // Èç¹û LookAheadBuffer Öаüº¬ÁËÈ«²¿Êý¾Ý { // ?ÖÅäÄÚ´æ Status = NdisAllocateMemory(&pPacketContent, BUFFER_SIZE, 0, HighestAcceptableMax); if(Status != NDIS_STATUS_SUCCESS) { DbgPrint(\"PTReceive:NdisAllocateMemory Failed\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } if(pPacketContent == NULL) { DbgPrint(\"PTReceive:pPacketContent==NULL\\n\"); return(NDIS_STATUS_NOT_ACCEPTED); } // ½«°üÍ?ºÍ LookAheadBuffer ¸´ÖƵ½ÐÂ?ÖÅäµÄÄÚ´æÖÐ NdisZeroMemory(pPacketContent, BUFFER_SIZE); NdisMoveMemory(pPacketContent, HeaderBuffer, HeaderBufferSize); NdisMoveMemory(pPacketContent+ HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize); PacketLen = PacketSize+HeaderBufferSize; //¹ýÂËICMP if(((char *)pPacketContent)[12] == 8 && ((char *)pPacketContent)[13] == 0 && ((char *)pPacketContent)[23] == 1) { DbgPrint(\"ICMP±»À¹½Ø!\\n\"); NdisFreeMemory(pPacketContent, 2000, 0); return NDIS_STATUS_NOT_ACCEPTED; } break; // ÔÚ°ü³ØÖÐ?ÖÅä°üÃèÊö?û NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle); if(Status == NDIS_STATUS_SUCCESS) { // ÔÚ»º³å³ØÖÐ?ÖÅ仺³åÃèÊö?û£¬½«°üÃèÊö?ûÓ뻺³åÃèÊö?û¹ØÁª¡£ NdisAllocateBuffer(&Status, &pPacketBuffer, pAdapt->RecvPacketPoolHandle, pPacketContent, PacketLen); NdisChainBufferAtFront(MyPacket, pPacketBuffer); MyPacket->Private.Head->Next = NULL; MyPacket->Private.Tail = NULL; Rsvd=(PRSVD)(MyPacket->MiniportReserved); Rsvd->OriginalPkt = NULL; NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize); NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES); // ÏòÉϲãЭÒéÇý¶¯Ö¸Ê¾Êý¾Ý°ü£¬?ÀÕæÍø¿¨ÐÐΪ¡£ NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1); if(NDIS_GET_PACKET_STATUS(MyPacket) != NDIS_STATUS_PENDING) { DBGPRINT((\"In PtReceive And Free Memory\\n\")); NdisFreeBuffer(pPacketBuffer); NdisFreeMemory(pPacketContent, BUFFER_SIZE, 0); NdisDprFreePacket(MyPacket); } } break; } |
|
8楼#
发布于:2005-06-01 15:17
仅针对以太网
以太帧指的是以太网上传输的数据,除了协议看到的数据包外,前头有前导码等,后面还有校验码。 对于ptrecieve中接收和NdisMIndicateReceivePacket发出去来讲,看到的都是以太网的数据包,不能叫以太帧 |
|