NdisMCoIndicateReceivePacket
VOID
NdisMCoIndicateReceivePacket(
IN NDIS_HANDLE NdisVcHandle,
IN PPNDIS_PACKET PacketArray,
IN UINT NumberOfPackets
);
|
NdisMCoIndicateReceivePacketÀº NDIS°¡ VC¿¡ ´ëÇÑ ÆÐŶµéÀÇ ¹è¿Àº Àû´çÇÑ Å¬¶óÀÌ¾ðÆ® È¤Àº ÄÝ ¸Å´ÏÀú¿¡°Ô Æ÷¿öµåÇϱâ À§ÇØ ÀÌ¿ëµÉ ¼ö ÀÖ´Ù´Â °ÍÀ» ¾Ë¸°´Ù.
¸Å°³º¯¼ö
- NdisVcHandle
- VC¸¦ ³ªÅ¸³»´Â ÇÚµéÀ» ÁöÁ¤ÇÑ´Ù. NIC µå¶óÀ̹ö´Â ¿ø·¡ Ŭ¶óÀÌ¾ðÆ®°¡ ³ªÅ¸´Â È£ÃâÀ» ¼³Á¤ÇÒ ¶§ ȤÀº ÄÝ ¸Å´ÏÀú°¡ µé¾î¿À´Â È£ÃâÀÇ ÁÖÁöµéÀ» ³ªÅ¸³»±â À§ÇØ Å¬¶óÀÌ¾ðÆ® µî·Ï SAP¸¦ À§ÇØ VC¸¦ ¸¸µé ¶§ MiniportCoCreateVc ÇÔ¼ö¿¡ ´ëÇÑ ÀÔ·Â ¸Å°³º¯¼ö·Î¼ ÀÌ ÇÚµéÀ» ¾ò´Â´Ù.
- PacketArray
- ¼ö½ÅµÈ µ¥ÀÌÅ͸¦ ÁöÁ¤Çϱâ À§ÇØ È£ÃâÀÚ¿¡ ÀÇÇØ ¼³¸³µÈ °¢ µð½ºÅ©¸³ÅÍ·Î ÆÐŶ µð½ºÅ©¸³ÅÍ ¹è¿ Æ÷ÀÎÅ͵éÀ» °¡¸®Å²´Ù.
- NumberOfPackets
- ¾ó¸¶³ª ¸¹Àº Æ÷ÀÎÅ͵éÀÌ PacketArray¿¡ ¹è¿³»¿¡ ÀÖ´Â Áö¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ °ªÀº Àû¾îµµ 1ÀÌ µÉ °ÍÀÌ´Ù.
ÁÖ¼®
NdisMCoIndicateReceivePacket¿¡ ´ëÇÑ È£ÃâÀº NDIS´Â ¿¬°á ÁöÇâ NIC µå¶óÀ̹ö·Î ÁÖ¾îÁø NdisVcHandle¸¦ °øÀ¯Çϴ Ŭ¶óÀÌ¾ðÆ® È¤Àº ÄÝ ¸Å´ÏÀúÀÇ ProtocolCoReceivePacket ÇÔ¼ö¸¦ È£ÃâÇϵµ·Ï ÇÑ´Ù. ¿¬°á ÁöÇâ NIC µå¶óÀ̹ö°¡ ¸ÖƼÆÐŶ ȤÀº ÇϳªÀÇ ÆÐŶ ¸®½Ãºê ÀεðÄÉÀ̼ǵé·Î ¸¸µå´Â Áö´Â ½ÇÇà Á¾¼ÓÀÌ´Ù. ±×·¯³ª, ¸ÖƼ ÆÐŶ ÀεðÄÉÀ̼ǵéÀº ´õ ÁÁÀº ÆÛÆ÷¸Õ½º¸¦ ³ºÀ» ¼ö ÀÖ´Ù.
NdisMCoIndicateReceivePacket¸¦ È£ÃâÇϱâ Àü¿¡, ¹Ì´ÏÆ÷Æ®´Â ´ÙÀ½°ú °°ÀÌ ÆÐŶ ¹è¿À» ¼³Á¤ÇØ¾ß ÇÑ´Ù.
- PacketArrayÀÇ °¢ ¿ä¼Ò´Â È£ÃâÀÚ°¡ NdisAllocatePacketÇÔ¼ö·Î ÆÐŶ pool·ÎºÎÅÍ ÇÒ´çµÇ´Â ÆÐŶ µð½ºÅ©¸³ÅÍ¿¡ ´ëÇÑ Æ÷ÀÎÅÍÀÌ´Ù.
- ±×·¯ÇÑ ÆÐŶ µð½ºÅ©¸³ÅÍ¿¡ ¿¬°áµÈ ¸ðµç ¹öÆÛ µð½ºÅ©¸³Å͵éÀº NdisAllocateBuffer·Î ¹öÆÛ pool·ÎºÎÅÍ ÇÒ´ç µÇ¾îÁø´Ù. ¹Ì´ÏÆ÷Æ®´Â ¹öÆÛ µð½ºÅ©¸³ÅͰ¡ ´ÜÁö ÀεðÄÉÀ̼ÇÀ» À§ÇØ ¼ö½ÅµÈ µ¥ÀÌÅ͸¦ ¸ÊÇϱâ À§ÇØ ¸®½Ãºê ¹öÆÛÀÇ Ç® ¹üÀ§º¸´Ù ÀÛ°Ô ¼ö½ÅµÈ µ¥ÀÌÅ͸¦ Æ÷ÇÔÇÏ´Â NICÀÇ ¸®½Ãºê ¹öÆÛ¸¦ ¸ÊÇÎÇÏ´Â ¾î¶² ¹öÆÛ µð½ºÅ©¸³ÅÍ·Î NdisAdjustBufferLength¸¦ È£ÃâÇØ¾ß ÇÑ´Ù. (NIC µå¶óÀ̹ö´Â ¸¶Âù°¡Áö·Î, ±×·¯ÇÑ ¹öÆÛ µð½ºÅ©¸³ÅÍÀÇ ¼ÒÀ¯±ÇÀ» ´Ù½Ã ¾òÀ» ¶§ NdisAdjustBufferLength·Î ¸ÊÇÎÀ» ÀçÁ¶Á¤ÇØ¾ß ÇÑ´Ù.
- ¸¸¾à ¹Ì´ÏÆ÷Æ®°¡ ¸®½ÃºêµéÀ» À§ÇÑ Å¸ÀÓ ½ºÅÆÇÁµéÀ» ÀεðÄÉÀÌÆ®ÇÑ´Ù¸éÀº, NDIS_SET_PACKET_TIME_RECEIVED ¿Í ȤÀº NDIS_SET_PACKET_TIME_SENT ¸ÅÅ©·ÎµéÀ» »ç¿ëÇÏ¿© ÆÐŶ µð½ºÅ©¸³ÅÍ¿Í °ü·ÃµÈ NDIS_PACKET_OOB_DATA³»¿¡ TimeReceived ȤÀº TimeSent ¸â¹öµéÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù. ƯÁ¤ ¹è¿ÀÇ ¸ðµç ÆÐŶµéÀ» À§ÇØ ¸®½Ãºê ŸÀÓ½ºÅÆÇÁ·Î¼ ¼³Á¤µÈ °ªÀ» Áï½Ã ¾ò±â À§ÇØ NdisGetCurrentSystemTimeÀ» È£ÃâÇÒ ¼ö ÀÖ´Ù.
- ¾Æ¿ô¿Àºê¹êµå µ¥ÀÌÅÍ ºí·°³»¿¡ HeaderSize´Â ¿¬°á ÁöÇ⠹̵ð¾öÀ» À§ÇØ °¢ ¼ö½Å ÆÐŶÀÇ Çì´õ Å©±â¿Í ÀÏÄ¡ÇØ¾ß ÇÑ´Ù.
- ¸¸¾à µå¶óÀ̹ö´Â ¸®½ÃºêµéÀ» À§ÇØ ¾î¶² Ãß°¡ÀûÀÎ ¾Æ¿ô¿Àºê¹êµå Á¤º¸¸¦ ÀεðÄÉÀÌÆ®ÇÑ´Ù¸éÀº, OOB ºí·°³»¿¡ MediaSpecificInformation¿¡¼ È£ÃâÀÚ ÇÒ´ç ¹öÆÛ³»¿¡ Á¦°øµÈ Á¤º¸ÀÇ ¹ÙÀÌÆ® ¼ö·Î SizeMediaSpecificInfo¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. ¹Ì´ÏÆ÷Æ®´Â ÀÌ·¯ÇÑ °ªµéÀ» ¼³Á¤Çϱâ À§ÇØ NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO ¸ÅÅ©·Î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¸Áö ¾Ê´Ù¸éÀº, SizeMediaSpecificInfo´Â 0ÀÌ µÉ °ÍÀ̰í, MediaSpecificInformationÀº NULLÀÌ µÉ °ÍÀÌ´Ù.
- ¹Ì´ÏÆ÷Æ®´Â ¸¸¾à ÆÐŶ µð½ºÅ©¸³Å͵é°ú ƯÁ¤ ÀεðÄÉÀÌ¼Ç ³»¿¡ ¸î¸î ÆÐŶµéÀ» À§ÇÑ °ü·ÃµÈ ¹öÆÛ µð½ºÅ©¸³Å͵éÀÇ ¼ÒÀ¯±ÇÀ» ¾òÀ» Çʿ䰡 ÀÖ´Ù¸éÀº ¾Æ¿ô ¿Àºê ¹êµå µ¥ÀÌÅÍ ºí·°ÀÇ Status ¸â¹ö¸¦ NDIS_STATUS_RESOURCES·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
NDIS_STATUS_RESOURCES¸¦ ¼ÂÆÃÇÏ´Â °ÍÀº NDIS°¡ Ŭ¶óÀÌ¾ðÆ® È¤Àº ÄÝ ¸Å´ÏÀú°¡ ¹Ì´ÏÆ÷Æ®¿¡°Ô ÆÐŶ µ¥ÀÌÅ͸¦ º¹»çÇÏ°Ô ÇÏ°í °¢ ÆÐŶ µð½ºÅ©¸³ÅÍ(°ü·ÃµÈ ¹öÆÛµé)µéÀ» ÇØÁ¦Çϵµ·Ï ÇÔÀ¸·Î½á NdisVcHandleÀ» °øÀ¯ÇÏ´Â ÇÁ·ÎÅäÄÝ¿¡°Ô Çѹø¿¡ Çѹø °¢ ±×·¯ÇÑ ÆÐŶ µð½ºÅ©¸³Å͸¦ ÀεðÄÉÀÌÆ®Çϵµ·Ï ÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸éÀº NdisMCoIndicateReceivePacket¿¡ ´ëÇÑ È£ÃâÀº ÇÁ·ÎÅäÄÝ¿¡°Ô ÆÐŶ µð½ºÅ©¸³ÅͰ¡ ¹Ì´ÏÆ÷Æ®ÀÇ MiniportReturnPacket ÇÔ¼ö¿¡°Ô ¸®Å쵃 ¶§±îÁö °¢ ÆÐŶ µð½ºÅ©¸³ÅÍ¿¡ ¿¬°áµÈ ¹öÆÛµé¿¡ ´ëÇÑ ¹èŸÀûÀ̰í, Àбâ Àü¿ë Á¢±ÙÀ» Á¦°øÇÑ´Ù.
¹Ì´ÏÆ÷Æ®´Â NdisMCoIndicateReceivePacket¿¡ ´ëÇÑ ¸®ÅÏÀ¸·Î ÀεðÄÉÀÌÆ®µÈ ÆÐŶµéÀÇ »óŸ¦ Á¶»çÇÒ Çʿ䰡 ¾ø´Ù.
- ¸¸¾à ¹Ì´ÏÆ÷Æ®°¡ ÆÐŶ µð½ºÅ©¸³Å͸¦ À°èÃþÀ¸·Î ÀεðÄÉÀÌÆ®Çϱâ Àü¿¡, ÆÐŶÀÇ Status¸¦ NDIS_STATUS_SUCCESS·Î ¼³Á¤ÇÑ´Ù¸éÀº, ÆÐŶÀÇ StatusÀº Ç×»ó NdisMCoIndicateReceivePacketÀÌ ¸®ÅÏÇÏÀÚ¸¶ÀÚ Ç×»ó NDIS_STATUS_PENDINGÀÌ µÈ´Ù. NDIS°¡ °è¼ÓÀûÀ¸·Î ¹Ì´ÏÆ÷Æ®ÀÇ MiniportReturnPacket ÇÔ¼ö¿¡ ´ëÇÑ ÆÐŶ µð½ºÅ©¸³Å͸¦ ÆÐŶÀÇ »óŸ¦ NDIS_STATUS_SUCCESS ·Î ¼³Á¤Çؼ ¸®ÅÏÇÑ´Ù.
- ¸¸¾à ¹Ì´ÏÆ÷Æ®°¡ ÆÐŶ µð½ºÅ©¸³Å͸¦ À °èÃþ¿¡ ÀεðÄÉÀ̵ùÇϱâÀü¿¡, ÆÐŶÀÇ Status¸¦ ¼³Á¤ÇÑ´Ù¸éÀº ÆÐŶÀÇ Status´Â Ç×»ó NdisMCoIndicateReceivePacketÀÌ ¸®ÅÏÇÏÀÚ¸¶ÀÚ NDIS_STATUS_SUCCESSÀÌ´Ù.
¹Ì´ÏÆ÷Æ®°¡ ÀεðÄÉÀÌÆ®µÈ ÆÐŶ µð½ºÅ©¸³ÅÍÀÇ ¼ÒÀ¯±ÇÀ» ´Ù½Ã ¾ò´Â´Ù¸éÀº, NDIS_OOB_DATA_FROM_PACKET¿¡ ÀÇÇØ ¸®ÅÏµÈ Æ÷ÀÎÅ͸¦ NdisZeroMemory·Î Àü´ÞÇÔÀ¸·Î½á Àç»ç¿ëÀ» À§ÇÑ °ü·ÃµÈ ¾Æ¿ô ¿Àºê ¹êµå µ¥ÀÌÅÍºí·°µéÀ» ÁغñÇÒ ¼ö ÀÖ´Ù. ´ëü¾ÈÀ¸·Î¼, ¹Ì´ÏÆ÷Æ®´Â °£´ÜÇÏ°Ô NDIS_SET_PACKET_XXX ¸ÅÅ©·Îµé·Î ȤÀº NDIS_OOB_DATA_FROM_PACKET¿¡ ÀÇÇØ ¸®ÅÏµÈ Æ÷ÀÎÅÍ·Î ¿¬¼ÓÀûÀÎ ¸®½Ãºê¿¡¼ °ü·ÃµÈ ¸â¹ö(µé)À» ¸®¼ÂÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª, ¹Ì´ÏÆ÷Æ®´Â ÀÌ·¸°Ô ÇÏ´Â °ÍÀº °è¼ÓµÈ ¸®½Ãºê ÀεðÄÉÀ̼ǵéÀ» »ç¿ëÇÒ ¼ö ¾ø°Ô ÆÐŶ µð½ºÅ©¸³Å͸¦ ÆÄ±«Çϱ⠶§¹®¿¡ NdisZeroMemory¿¡ ÆÐŶ µð½ºÅ©¸³ÅÍ Æ÷ÀÎÅ͸¦ °áÄÚ Àü´ÞÇÒ Çʿ䰡 ¾ø´Ù.
MiniportHandleInterrupt ÇÔ¼ö·ÎºÎÅÍ NdisMCoIndicateReceivePacket¿¡ ´ëÇÑ ¸î¸î ¹Ì´ÏÆ÷Æ® °áÁ¤ ¸¸ÅÀÇ È£Ãâ ÈÄ¿¡ ¹Ì´ÏÆ÷Æ®´Â NdisMCoReceiveComplete¸¦ È£ÃâÇØ¾ß ÇÑ´Ù.
¸¸¾à ÇÁ·ÎÅäÄÝÀÌ ÃæºÐÈ÷ Áï½Ã ¸®½Ãºê ÀεðÄÉÀ̼ÇÀ» À§ÇØ ¹Ì´ÏÆ÷Æ® ÇÒ´ç ÀÚ¿øµéÀ» ¸®ÅÏÇÏÁö ¾Ê´Â´Ù¸éÀº, NIC µå¶óÀ̹ö´Â NIC µå¶óÀ̹ö°¡ ¿¬¼ÓÀûÀÎ ¸®½Ãºê ÀεðÄÉÀ̼ǵéÀ» À§ÇØ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ÆÐŶ ȤÀº ¹öÆÛ µð½ºÅ©¸³Å͵é(ȤÀº ½ÉÁö¾î NIC¿¡¼ ¸®½Ãºê ¹öÆÛ °ø°£)¿¡¼ ³·°Ô ½ÇÇàÇÒ ¼ö ÀÖ´Â ±ÔÄ¢À» ¾î±â´Â ÇÁ·ÎÅäÄÝ¿¡°Ô °æ°íÇϱâ À§ÇØ NdisMCoIndicateStatus¿¡ NDIS_STATUS_RESOURCES·Î È£ÃâÇÒ ¼ö ÀÖ´Ù.
NdisMCoIndicateReceivePacketÀÇ È£ÃâÀÚµéÀº IRQL DISPATCH_LEVEL¿¡¼ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª, NIC µå¶óÀ̹ö°¡ ÀϹÝÀûÀ¸·Î Ç×»ó IRQL DISPATCH_LEVEL¿¡¼ ½ÇÇàÇÏ´Â MiniportHandleInterrupt ÇÔ¼ö·ÎºÎÅÍ ÀÌ È£ÃâÀ» ÇÑ´Ù.
|