]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/MnpDxe/MnpIo.c
Change the file headers and some function comments.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / MnpDxe / MnpIo.c
index cde235912f1b34117ba8a7422da25519cc703270..d63bad00b88c8c4accfe9eb34721959b2e9a4385 100644 (file)
@@ -1,6 +1,7 @@
 /** @file\r
-\r
-Copyright (c) 2005 - 2007, Intel Corporation\r
+    Implementation of Managed Network Protocol I/O functions.\r
+    \r
+Copyright (c) 2005 - 2007, Intel Corporation. <BR>\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -9,22 +10,13 @@ http://opensource.org/licenses/bsd-license.php
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-Module Name:\r
-\r
-  MnpIo.c\r
-\r
-Abstract:\r
-\r
-  Implementation of Managed Network Protocol I/O functions.\r
-\r
-\r
 **/\r
 \r
+#include "MnpImpl.h"\r
 #include <Library/NetLib.h>\r
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/BaseLib.h>\r
 #include <Library/MemoryAllocationLib.h>\r
-#include "MnpImpl.h"\r
 \r
 \r
 /**\r
@@ -43,7 +35,6 @@ MnpIsValidTxToken (
   )\r
 {\r
   MNP_SERVICE_DATA                  *MnpServiceData;\r
-  EFI_SIMPLE_NETWORK_MODE           *SnpMode;\r
   EFI_MANAGED_NETWORK_TRANSMIT_DATA *TxData;\r
   UINT32                            Index;\r
   UINT32                            TotalLength;\r
@@ -52,7 +43,6 @@ MnpIsValidTxToken (
   MnpServiceData = Instance->MnpServiceData;\r
   NET_CHECK_SIGNATURE (MnpServiceData, MNP_SERVICE_DATA_SIGNATURE);\r
 \r
-  SnpMode = MnpServiceData->Snp->Mode;\r
   TxData  = Token->Packet.TxData;\r
 \r
   if ((Token->Event == NULL) || (TxData == NULL) || (TxData->FragmentCount == 0)) {\r
@@ -60,7 +50,7 @@ MnpIsValidTxToken (
     // The token is invalid if the Event is NULL, or the TxData is NULL, or\r
     // the fragment count is zero.\r
     //\r
-    MNP_DEBUG_WARN (("MnpIsValidTxToken: Invalid Token.\n"));\r
+    DEBUG ((EFI_D_WARN, "MnpIsValidTxToken: Invalid Token.\n"));\r
     return FALSE;\r
   }\r
 \r
@@ -69,7 +59,7 @@ MnpIsValidTxToken (
     // The token is invalid if the HeaderLength isn't zero while the DestinationAddress\r
     // is NULL (The destination address is already put into the packet).\r
     //\r
-    MNP_DEBUG_WARN (("MnpIsValidTxToken: DestinationAddress isn't NULL, HeaderLength must be 0.\n"));\r
+    DEBUG ((EFI_D_WARN, "MnpIsValidTxToken: DestinationAddress isn't NULL, HeaderLength must be 0.\n"));\r
     return FALSE;\r
   }\r
 \r
@@ -81,7 +71,7 @@ MnpIsValidTxToken (
       //\r
       // The token is invalid if any FragmentLength is zero or any FragmentBuffer is NULL.\r
       //\r
-      MNP_DEBUG_WARN (("MnpIsValidTxToken: Invalid FragmentLength or FragmentBuffer.\n"));\r
+      DEBUG ((EFI_D_WARN, "MnpIsValidTxToken: Invalid FragmentLength or FragmentBuffer.\n"));\r
       return FALSE;\r
     }\r
 \r
@@ -100,7 +90,7 @@ MnpIsValidTxToken (
     // The length calculated from the fragment information doesn't equal to the\r
     // sum of the DataLength and the HeaderLength.\r
     //\r
-    MNP_DEBUG_WARN (("MnpIsValidTxData: Invalid Datalength compared with the sum of fragment length.\n"));\r
+    DEBUG ((EFI_D_WARN, "MnpIsValidTxData: Invalid Datalength compared with the sum of fragment length.\n"));\r
     return FALSE;\r
   }\r
 \r
@@ -108,7 +98,7 @@ MnpIsValidTxToken (
     //\r
     // The total length is larger than the MTU.\r
     //\r
-    MNP_DEBUG_WARN (("MnpIsValidTxData: TxData->DataLength exceeds Mtu.\n"));\r
+    DEBUG ((EFI_D_WARN, "MnpIsValidTxData: TxData->DataLength exceeds Mtu.\n"));\r
     return FALSE;\r
   }\r
 \r
@@ -126,8 +116,6 @@ MnpIsValidTxToken (
   @param  PktLen                Pointer to a UINT32 variable used to record the\r
                                 packet's length.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 MnpBuildTxPacket (\r
@@ -171,7 +159,7 @@ MnpBuildTxPacket (
       //\r
       // Copy the data.\r
       //\r
-      NetCopyMem (\r
+      CopyMem (\r
         DstPos,\r
         TxData->FragmentTable[Index].FragmentBuffer,\r
         TxData->FragmentTable[Index].FragmentLength\r
@@ -262,7 +250,7 @@ MnpSyncSendPacket (
       //\r
       // Get the recycled transmit buffer status.\r
       //\r
-      Snp->GetStatus (Snp, NULL, &TxBuf);\r
+      Snp->GetStatus (Snp, NULL, (VOID **) &TxBuf);\r
 \r
       if (!EFI_ERROR (gBS->CheckEvent (MnpServiceData->TxTimeoutEvent))) {\r
 \r
@@ -296,6 +284,11 @@ SIGNAL_TOKEN:
   Token->Status = Status;\r
   gBS->SignalEvent (Token->Event);\r
 \r
+  //\r
+  // Dispatch the DPC queued by the NotifyFunction of Token->Event.\r
+  //\r
+  NetLibDispatchDpc ();\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -326,7 +319,7 @@ MnpInstanceDeliverPacket (
   MnpServiceData = Instance->MnpServiceData;\r
   NET_CHECK_SIGNATURE (MnpServiceData, MNP_SERVICE_DATA_SIGNATURE);\r
 \r
-  if (NetMapIsEmpty (&Instance->RxTokenMap) || NetListIsEmpty (&Instance->RcvdPacketQueue)) {\r
+  if (NetMapIsEmpty (&Instance->RxTokenMap) || IsListEmpty (&Instance->RcvdPacketQueue)) {\r
     //\r
     // No pending received data or no available receive token, return.\r
     //\r
@@ -343,7 +336,7 @@ MnpInstanceDeliverPacket (
     //\r
     DupNbuf = MnpAllocNbuf (MnpServiceData);\r
     if (DupNbuf == NULL) {\r
-      MNP_DEBUG_WARN (("MnpDeliverPacket: Failed to allocate a free Nbuf.\n"));\r
+      DEBUG ((EFI_D_WARN, "MnpDeliverPacket: Failed to allocate a free Nbuf.\n"));\r
 \r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
@@ -376,7 +369,7 @@ MnpInstanceDeliverPacket (
   //\r
   // Insert this RxDataWrap into the delivered queue.\r
   //\r
-  NetListInsertTail (&Instance->RxDeliveredPacketQueue, &RxDataWrap->WrapEntry);\r
+  InsertTailList (&Instance->RxDeliveredPacketQueue, &RxDataWrap->WrapEntry);\r
 \r
   //\r
   // Get the receive token from the RxTokenMap.\r
@@ -402,13 +395,12 @@ MnpInstanceDeliverPacket (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 MnpDeliverPacket (\r
   IN MNP_SERVICE_DATA  *MnpServiceData\r
   )\r
 {\r
-  NET_LIST_ENTRY    *Entry;\r
+  LIST_ENTRY        *Entry;\r
   MNP_INSTANCE_DATA *Instance;\r
 \r
   NET_CHECK_SIGNATURE (MnpServiceData, MNP_SERVICE_DATA_SIGNATURE);\r
@@ -432,8 +424,6 @@ MnpDeliverPacket (
   @param  Event                 The event this notify function registered to.\r
   @param  Context               Pointer to the context data registerd to the Event.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -469,9 +459,9 @@ MnpRecycleRxData (
   //\r
   // Remove this Wrap entry from the list.\r
   //\r
-  NetListRemoveEntry (&RxDataWrap->WrapEntry);\r
+  RemoveEntryList (&RxDataWrap->WrapEntry);\r
 \r
-  NetFreePool (RxDataWrap);\r
+  gBS->FreePool (RxDataWrap);\r
 }\r
 \r
 \r
@@ -485,7 +475,6 @@ MnpRecycleRxData (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 MnpQueueRcvdPacket (\r
   IN MNP_INSTANCE_DATA  *Instance,\r
@@ -502,7 +491,7 @@ MnpQueueRcvdPacket (
   //\r
   if (Instance->RcvdPacketQueueSize == MNP_MAX_RCVD_PACKET_QUE_SIZE) {\r
 \r
-    MNP_DEBUG_WARN (("MnpQueueRcvdPacket: Drop one packet bcz queue size limit reached.\n"));\r
+    DEBUG ((EFI_D_WARN, "MnpQueueRcvdPacket: Drop one packet bcz queue size limit reached.\n"));\r
 \r
     //\r
     // Get the oldest packet.\r
@@ -528,7 +517,7 @@ MnpQueueRcvdPacket (
   //\r
   // Insert this Wrap into the instance queue.\r
   //\r
-  NetListInsertTail (&Instance->RcvdPacketQueue, &RxDataWrap->WrapEntry);\r
+  InsertTailList (&Instance->RcvdPacketQueue, &RxDataWrap->WrapEntry);\r
   Instance->RcvdPacketQueueSize++;\r
 }\r
 \r
@@ -547,7 +536,6 @@ MnpQueueRcvdPacket (
   @return The received packet matches the instance's receive filters or not.\r
 \r
 **/\r
-STATIC\r
 BOOLEAN\r
 MnpMatchPacket (\r
   IN MNP_INSTANCE_DATA                 *Instance,\r
@@ -557,19 +545,13 @@ MnpMatchPacket (
   )\r
 {\r
   EFI_MANAGED_NETWORK_CONFIG_DATA *ConfigData;\r
-  NET_LIST_ENTRY                  *Entry;\r
+  LIST_ENTRY                      *Entry;\r
   MNP_GROUP_CONTROL_BLOCK         *GroupCtrlBlk;\r
 \r
   NET_CHECK_SIGNATURE (Instance, MNP_INSTANCE_DATA_SIGNATURE);\r
 \r
   ConfigData = &Instance->ConfigData;\r
 \r
-  if (ConfigData->EnablePromiscuousReceive) {\r
-    //\r
-    // Always match if this instance is configured to be promiscuous.\r
-    //\r
-    return TRUE;\r
-  }\r
   //\r
   // Check the protocol type.\r
   //\r
@@ -577,6 +559,13 @@ MnpMatchPacket (
     return FALSE;\r
   }\r
 \r
+  if (ConfigData->EnablePromiscuousReceive) {\r
+    //\r
+    // Always match if this instance is configured to be promiscuous.\r
+    //\r
+    return TRUE;\r
+  }\r
+\r
   //\r
   // The protocol type is matched, check receive filter, include unicast and broadcast.\r
   //\r
@@ -628,7 +617,6 @@ MnpMatchPacket (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 MnpAnalysePacket (\r
   IN  MNP_SERVICE_DATA                  *MnpServiceData,\r
@@ -640,7 +628,7 @@ MnpAnalysePacket (
 {\r
   EFI_SIMPLE_NETWORK_MODE *SnpMode;\r
   UINT8                   *BufPtr;\r
-  NET_LIST_ENTRY          *Entry;\r
+  LIST_ENTRY              *Entry;\r
 \r
   SnpMode = MnpServiceData->Snp->Mode;\r
 \r
@@ -703,7 +691,7 @@ MnpAnalysePacket (
     }\r
   }\r
 \r
-  NetZeroMem (&RxData->Timestamp, sizeof (EFI_TIME));\r
+  ZeroMem (&RxData->Timestamp, sizeof (EFI_TIME));\r
 \r
   //\r
   // Fill the common parts of RxData.\r
@@ -725,7 +713,6 @@ MnpAnalysePacket (
   @return Pointer to a MNP_RXDATA_WRAP which wraps the RxData.\r
 \r
 **/\r
-STATIC\r
 MNP_RXDATA_WRAP *\r
 MnpWrapRxData (\r
   IN MNP_INSTANCE_DATA                 *Instance,\r
@@ -738,9 +725,9 @@ MnpWrapRxData (
   //\r
   // Allocate memory.\r
   //\r
-  RxDataWrap = NetAllocatePool (sizeof (MNP_RXDATA_WRAP));\r
+  RxDataWrap = AllocatePool (sizeof (MNP_RXDATA_WRAP));\r
   if (RxDataWrap == NULL) {\r
-    MNP_DEBUG_ERROR (("MnpDispatchPacket: Failed to allocate a MNP_RXDATA_WRAP.\n"));\r
+    DEBUG ((EFI_D_ERROR, "MnpDispatchPacket: Failed to allocate a MNP_RXDATA_WRAP.\n"));\r
     return NULL;\r
   }\r
 \r
@@ -749,22 +736,22 @@ MnpWrapRxData (
   //\r
   // Fill the RxData in RxDataWrap,\r
   //\r
-  RxDataWrap->RxData = *RxData;\r
+  CopyMem (&RxDataWrap->RxData, RxData, sizeof (RxDataWrap->RxData));\r
 \r
   //\r
   // Create the recycle event.\r
   //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL,\r
-                  NET_TPL_RECYCLE,\r
+                  TPL_NOTIFY,\r
                   MnpRecycleRxData,\r
                   RxDataWrap,\r
                   &RxDataWrap->RxData.RecycleEvent\r
                   );\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpDispatchPacket: gBS->CreateEvent failed, %r.\n", Status));\r
-    NetFreePool (RxDataWrap);\r
+    DEBUG ((EFI_D_ERROR, "MnpDispatchPacket: gBS->CreateEvent failed, %r.\n", Status));\r
+    gBS->FreePool (RxDataWrap);\r
     return NULL;\r
   }\r
 \r
@@ -783,20 +770,21 @@ MnpWrapRxData (
   @return None.\r
 \r
 **/\r
-STATIC\r
 VOID\r
 MnpEnqueuePacket (\r
   IN MNP_SERVICE_DATA   *MnpServiceData,\r
   IN NET_BUF            *Nbuf\r
   )\r
 {\r
-  NET_LIST_ENTRY                    *Entry;\r
+  LIST_ENTRY                        *Entry;\r
   MNP_INSTANCE_DATA                 *Instance;\r
   EFI_MANAGED_NETWORK_RECEIVE_DATA  RxData;\r
   UINT8                             PktAttr;\r
   MNP_GROUP_ADDRESS                 *GroupAddress;\r
   MNP_RXDATA_WRAP                   *RxDataWrap;\r
 \r
+\r
+  GroupAddress = NULL;\r
   //\r
   // First, analyse the packet header.\r
   //\r
@@ -883,7 +871,7 @@ MnpReceivePacket (
     return EFI_NOT_STARTED;\r
   }\r
 \r
-  if (NetListIsEmpty (&MnpServiceData->ChildrenList)) {\r
+  if (IsListEmpty (&MnpServiceData->ChildrenList)) {\r
     //\r
     // There is no child, no need to receive packets.\r
     //\r
@@ -923,8 +911,8 @@ MnpReceivePacket (
 \r
     DEBUG_CODE (\r
       if (Status != EFI_NOT_READY) {\r
-      MNP_DEBUG_ERROR (("MnpReceivePacket: Snp->Receive() = %r.\n", Status));\r
-    }\r
+        DEBUG ((EFI_D_WARN, "MnpReceivePacket: Snp->Receive() = %r.\n", Status));\r
+      }\r
     );\r
 \r
     return Status;\r
@@ -935,8 +923,9 @@ MnpReceivePacket (
   //\r
   if ((HeaderSize != Snp->Mode->MediaHeaderSize) || (BufLen < HeaderSize)) {\r
 \r
-    MNP_DEBUG_WARN (\r
-      ("MnpReceivePacket: Size error, HL:TL = %d:%d.\n",\r
+    DEBUG (\r
+      (EFI_D_WARN,\r
+      "MnpReceivePacket: Size error, HL:TL = %d:%d.\n",\r
       HeaderSize,\r
       BufLen)\r
       );\r
@@ -967,7 +956,7 @@ MnpReceivePacket (
     Nbuf                        = MnpAllocNbuf (MnpServiceData);\r
     MnpServiceData->RxNbufCache = Nbuf;\r
     if (Nbuf == NULL) {\r
-      MNP_DEBUG_ERROR (("MnpReceivePacket: Alloc packet for receiving cache failed.\n"));\r
+      DEBUG ((EFI_D_ERROR, "MnpReceivePacket: Alloc packet for receiving cache failed.\n"));\r
       return EFI_DEVICE_ERROR;\r
     }\r
 \r
@@ -976,7 +965,10 @@ MnpReceivePacket (
     //\r
     // No receiver for this packet.\r
     //\r
-    NetbufAllocSpace (Nbuf, Trimmed, NET_BUF_TAIL);\r
+    if (Trimmed > 0) {\r
+      NetbufAllocSpace (Nbuf, Trimmed, NET_BUF_TAIL);\r
+    }\r
+\r
     goto EXIT;\r
   }\r
   //\r
@@ -984,6 +976,11 @@ MnpReceivePacket (
   //\r
   MnpDeliverPacket (MnpServiceData);\r
 \r
+  //\r
+  // Dispatch the DPC queued by the NotifyFunction of rx token's events.\r
+  //\r
+  NetLibDispatchDpc ();\r
+\r
 EXIT:\r
 \r
   ASSERT (Nbuf->TotalSize == MnpServiceData->BufferLength);\r
@@ -998,9 +995,7 @@ EXIT:
   @param  Event                 The event this notify function registered to.\r
   @param  Context               Pointer to the context data registered to the\r
                                 event.\r
-\r
-  @return None.\r
-\r
+   \r
 **/\r
 VOID\r
 EFIAPI\r
@@ -1010,9 +1005,9 @@ MnpCheckPacketTimeout (
   )\r
 {\r
   MNP_SERVICE_DATA  *MnpServiceData;\r
-  NET_LIST_ENTRY    *Entry;\r
-  NET_LIST_ENTRY    *RxEntry;\r
-  NET_LIST_ENTRY    *NextEntry;\r
+  LIST_ENTRY        *Entry;\r
+  LIST_ENTRY        *RxEntry;\r
+  LIST_ENTRY        *NextEntry;\r
   MNP_INSTANCE_DATA *Instance;\r
   MNP_RXDATA_WRAP   *RxDataWrap;\r
   EFI_TPL           OldTpl;\r
@@ -1033,26 +1028,29 @@ MnpCheckPacketTimeout (
       continue;\r
     }\r
 \r
-    OldTpl = NET_RAISE_TPL (NET_TPL_RECYCLE);\r
+    OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
     NET_LIST_FOR_EACH_SAFE (RxEntry, NextEntry, &Instance->RcvdPacketQueue) {\r
 \r
       RxDataWrap = NET_LIST_USER_STRUCT (RxEntry, MNP_RXDATA_WRAP, WrapEntry);\r
 \r
-      if (RxDataWrap->TimeoutTick >= MNP_TIMEOUT_CHECK_INTERVAL) {\r
+      //\r
+      // TimeoutTick unit is ms, MNP_TIMEOUT_CHECK_INTERVAL unit is 100ns.\r
+      //\r
+      if (RxDataWrap->TimeoutTick >= (MNP_TIMEOUT_CHECK_INTERVAL / 10)) {\r
 \r
-        RxDataWrap->TimeoutTick -= MNP_TIMEOUT_CHECK_INTERVAL;\r
+        RxDataWrap->TimeoutTick -= (MNP_TIMEOUT_CHECK_INTERVAL / 10);\r
       } else {\r
         //\r
         // Drop the timeout packet.\r
         //\r
-        MNP_DEBUG_WARN (("MnpCheckPacketTimeout: Received packet timeout.\n"));\r
+        DEBUG ((EFI_D_WARN, "MnpCheckPacketTimeout: Received packet timeout.\n"));\r
         MnpRecycleRxData (NULL, RxDataWrap);\r
         Instance->RcvdPacketQueueSize--;\r
       }\r
     }\r
 \r
-    NET_RESTORE_TPL (OldTpl);\r
+    gBS->RestoreTPL (OldTpl);\r
   }\r
 }\r
 \r
@@ -1065,8 +1063,6 @@ MnpCheckPacketTimeout (
   @param  Context               Pointer to the context data registered to the\r
                                 event.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -1084,4 +1080,6 @@ MnpSystemPoll (
   // Try to receive packets from Snp.\r
   //\r
   MnpReceivePacket (MnpServiceData);\r
+\r
+  NetLibDispatchDpc ();\r
 }\r