]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/MnpDxe/MnpConfig.c
Change the file headers and some function comments.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / MnpDxe / MnpConfig.c
index c2bb839e6b0600699bd1536c0a3adbf4f0cb8a3f..94bbe18847e37fb3e484bc646ba0152147cdd5d8 100644 (file)
@@ -1,23 +1,15 @@
 /** @file\r
+  Implementation of Managed Network Protocol private services.\r
 \r
-Copyright (c) 2005 - 2007, Intel Corporation\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
-http://opensource.org/licenses/bsd-license.php\r
+Copyright (c) 2005 - 2008, Intel Corporation. <BR> \r
+All rights reserved. This program and the accompanying materials are licensed \r
+and made available under the terms and conditions of the BSD License which \r
+accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
 \r
 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
-  MnpConfig.c\r
-\r
-Abstract:\r
-\r
-  Implementation of Managed Network Protocol private services.\r
-\r
-\r
 **/\r
 \r
 \r
@@ -52,76 +44,175 @@ EFI_MANAGED_NETWORK_CONFIG_DATA mMnpDefaultConfigData = {
   FALSE\r
 };\r
 \r
-STATIC\r
-EFI_STATUS\r
-MnpAddFreeNbuf (\r
-  IN MNP_SERVICE_DATA  *MnpServiceData,\r
-  IN UINTN             Count\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-MnpStartSnp (\r
-  IN EFI_SIMPLE_NETWORK_PROTOCOL  *Snp\r
-  );\r
-\r
-STATIC\r
-EFI_STATUS\r
-MnpStopSnp (\r
-  IN EFI_SIMPLE_NETWORK_PROTOCOL  *Snp\r
-  );\r
+/**\r
+  Configure the Snp receive filters according to the instances' receive filter\r
+  settings.\r
 \r
-STATIC\r
-EFI_STATUS\r
-MnpStart (\r
-  IN MNP_SERVICE_DATA  *MnpServiceData,\r
-  IN BOOLEAN           IsConfigUpdate,\r
-  IN BOOLEAN           EnableSystemPoll\r
-  );\r
+  @param  MnpServiceData        Pointer to the mnp service context data.\r
 \r
-STATIC\r
-EFI_STATUS\r
-MnpStop (\r
-  IN MNP_SERVICE_DATA  *MnpServiceData\r
-  );\r
+  @retval EFI_SUCCESS           The receive filters is configured.\r
+  @retval EFI_OUT_OF_RESOURCES  The receive filters can't be configured due to \r
+                                lack of memory resource.\r
 \r
-STATIC\r
+**/\r
 EFI_STATUS\r
 MnpConfigReceiveFilters (\r
   IN MNP_SERVICE_DATA  *MnpServiceData\r
-  );\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
+  EFI_MAC_ADDRESS             *MCastFilter;\r
+  UINT32                      MCastFilterCnt;\r
+  UINT32                      EnableFilterBits;\r
+  UINT32                      DisableFilterBits;\r
+  BOOLEAN                     ResetMCastFilters;\r
+  LIST_ENTRY                  *Entry;\r
+  UINT32                      Index;\r
+  MNP_GROUP_ADDRESS           *GroupAddress;\r
 \r
-STATIC\r
-EFI_STATUS\r
-MnpGroupOpAddCtrlBlk (\r
-  IN MNP_INSTANCE_DATA        *Instance,\r
-  IN MNP_GROUP_CONTROL_BLOCK  *CtrlBlk,\r
-  IN MNP_GROUP_ADDRESS        *GroupAddress OPTIONAL,\r
-  IN EFI_MAC_ADDRESS          *MacAddress,\r
-  IN UINT32                   HwAddressSize\r
-  );\r
+  NET_CHECK_SIGNATURE (MnpServiceData, MNP_SERVICE_DATA_SIGNATURE);\r
 \r
-STATIC\r
-BOOLEAN\r
-MnpGroupOpDelCtrlBlk (\r
-  IN MNP_INSTANCE_DATA        *Instance,\r
-  IN MNP_GROUP_CONTROL_BLOCK  *CtrlBlk\r
+  Snp = MnpServiceData->Snp;\r
+\r
+  //\r
+  // Initialize the enable filter and disable filter.\r
+  //\r
+  EnableFilterBits  = 0;\r
+  DisableFilterBits = Snp->Mode->ReceiveFilterMask;\r
+\r
+  if (MnpServiceData->UnicastCount != 0) {\r
+    //\r
+    // Enable unicast if any instance wants to receive unicast.\r
+    //\r
+    EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;\r
+  }\r
+\r
+  if (MnpServiceData->BroadcastCount != 0) {\r
+    //\r
+    // Enable broadcast if any instance wants to receive broadcast.\r
+    //\r
+    EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;\r
+  }\r
+\r
+  MCastFilter       = NULL;\r
+  MCastFilterCnt    = 0;\r
+  ResetMCastFilters = TRUE;\r
+\r
+  if ((MnpServiceData->MulticastCount != 0) && (MnpServiceData->GroupAddressCount != 0)) {\r
+    //\r
+    // There are instances configured to receive multicast and already some group\r
+    // addresses are joined.\r
+    //\r
+\r
+    ResetMCastFilters = FALSE;\r
+\r
+    if (MnpServiceData->GroupAddressCount <= Snp->Mode->MaxMCastFilterCount) {\r
+      //\r
+      // The joind group address is less than simple network's maximum count.\r
+      // Just configure the snp to do the multicast filtering.\r
+      //\r
+\r
+      EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST;\r
+\r
+      //\r
+      // Allocate pool for the mulicast addresses.\r
+      //\r
+      MCastFilterCnt  = MnpServiceData->GroupAddressCount;\r
+      MCastFilter     = AllocatePool (sizeof (EFI_MAC_ADDRESS) * MCastFilterCnt);\r
+      if (MCastFilter == NULL) {\r
+\r
+        DEBUG ((EFI_D_ERROR, "MnpConfigReceiveFilters: Failed to allocate memory resource for MCastFilter.\n"));\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+\r
+      //\r
+      // Fill the multicast HW address buffer.\r
+      //\r
+      Index = 0;\r
+      NET_LIST_FOR_EACH (Entry, &MnpServiceData->GroupAddressList) {\r
+\r
+        GroupAddress            = NET_LIST_USER_STRUCT (Entry, MNP_GROUP_ADDRESS, AddrEntry);\r
+        CopyMem (MCastFilter + Index, &GroupAddress->Address, sizeof (*(MCastFilter + Index)));\r
+        Index++;\r
+\r
+        ASSERT (Index <= MCastFilterCnt);\r
+      }\r
+    } else {\r
+      //\r
+      // The maximum multicast is reached, set the filter to be promiscuous\r
+      // multicast.\r
+      //\r
+\r
+      if (Snp->Mode->ReceiveFilterMask & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) {\r
+        EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;\r
+      } else {\r
+        //\r
+        // Either MULTICAST or PROMISCUOUS_MULTICAST is not supported by Snp,\r
+        // set the NIC to be promiscuous although this will tremendously degrade\r
+        // the performance.\r
+        //\r
+        EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;\r
+      }\r
+    }\r
+  }\r
+\r
+  if (MnpServiceData->PromiscuousCount != 0) {\r
+    //\r
+    // Enable promiscuous if any instance wants to receive promiscuous.\r
+    //\r
+    EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;\r
+  }\r
+\r
+  //\r
+  // Set the disable filter.\r
+  //\r
+  DisableFilterBits ^= EnableFilterBits;\r
+\r
+  //\r
+  // Configure the receive filters of SNP.\r
+  //\r
+  Status = Snp->ReceiveFilters (\r
+                  Snp,\r
+                  EnableFilterBits,\r
+                  DisableFilterBits,\r
+                  ResetMCastFilters,\r
+                  MCastFilterCnt,\r
+                  MCastFilter\r
+                  );\r
+  DEBUG_CODE (\r
+    if (EFI_ERROR (Status)) {\r
+\r
+    DEBUG (\r
+      (EFI_D_ERROR,\r
+      "MnpConfigReceiveFilters: Snp->ReceiveFilters failed, %r.\n",\r
+      Status)\r
+      );\r
+  }\r
   );\r
 \r
+  if (MCastFilter != NULL) {\r
+    //\r
+    // Free the buffer used to hold the group addresses.\r
+    //\r
+    gBS->FreePool (MCastFilter);\r
+  }\r
+\r
+  return Status;\r
+}\r
 \r
 /**\r
-  Add some NET_BUF into MnpServiceData->FreeNbufQue. The buffer length of\r
-  the NET_BUF is specified by MnpServiceData->BufferLength.\r
+  Add Count of net buffers to MnpServiceData->FreeNbufQue. The length of the net\r
+  buffer is specified by MnpServiceData->BufferLength. \r
 \r
   @param  MnpServiceData        Pointer to the MNP_SERVICE_DATA.\r
   @param  Count                 Number of NET_BUFFERs to add.\r
 \r
-  @retval EFI_SUCCESS           The specified amount of NET_BUFs are allocated and\r
-                                added into MnpServiceData->FreeNbufQue.\r
+  @retval EFI_SUCCESS           The specified amount of NET_BUFs are allocated \r
+                                and added to MnpServiceData->FreeNbufQue.\r
   @retval EFI_OUT_OF_RESOURCES  Failed to allocate a NET_BUF structure.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 MnpAddFreeNbuf (\r
   IN MNP_SERVICE_DATA  *MnpServiceData,\r
@@ -142,7 +233,7 @@ MnpAddFreeNbuf (
     Nbuf = NetbufAlloc (MnpServiceData->BufferLength + MnpServiceData->PaddingSize);\r
     if (Nbuf == NULL) {\r
 \r
-      MNP_DEBUG_ERROR (("MnpAddFreeNbuf: NetBufAlloc failed.\n"));\r
+      DEBUG ((EFI_D_ERROR, "MnpAddFreeNbuf: NetBufAlloc failed.\n"));\r
       Status = EFI_OUT_OF_RESOURCES;\r
       break;\r
     }\r
@@ -171,7 +262,8 @@ MnpAddFreeNbuf (
 \r
   @param  MnpServiceData        Pointer to the MNP_SERVICE_DATA.\r
 \r
-  @return Pointer to the allocated free NET_BUF structure, if NULL the operation is failed.\r
+  @return     Pointer to the allocated free NET_BUF structure, if NULL the \r
+              operation is failed.\r
 \r
 **/\r
 NET_BUF *\r
@@ -188,7 +280,7 @@ MnpAllocNbuf (
 \r
   FreeNbufQue = &MnpServiceData->FreeNbufQue;\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_RECYCLE);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
   //\r
   // Check whether there are available buffers, or else try to add some.\r
@@ -197,8 +289,9 @@ MnpAllocNbuf (
 \r
     if ((MnpServiceData->NbufCnt + MNP_NET_BUFFER_INCREASEMENT) > MNP_MAX_NET_BUFFER_NUM) {\r
 \r
-      MNP_DEBUG_ERROR (\r
-        ("MnpAllocNbuf: The maximum NET_BUF size is reached for MNP driver instance %p.\n",\r
+      DEBUG (\r
+        (EFI_D_ERROR,\r
+        "MnpAllocNbuf: The maximum NET_BUF size is reached for MNP driver instance %p.\n",\r
         MnpServiceData)\r
         );\r
 \r
@@ -209,8 +302,9 @@ MnpAllocNbuf (
     Status = MnpAddFreeNbuf (MnpServiceData, MNP_NET_BUFFER_INCREASEMENT);\r
     if (EFI_ERROR (Status)) {\r
 \r
-      MNP_DEBUG_ERROR (\r
-        ("MnpAllocNbuf: Failed to add NET_BUFs into the FreeNbufQue, %r.\n",\r
+      DEBUG (\r
+        (EFI_D_ERROR,\r
+        "MnpAllocNbuf: Failed to add NET_BUFs into the FreeNbufQue, %r.\n",\r
         Status)\r
         );\r
       //\r
@@ -230,7 +324,7 @@ MnpAllocNbuf (
   }\r
 \r
 ON_EXIT:\r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
   return Nbuf;\r
 }\r
@@ -242,8 +336,6 @@ ON_EXIT:
   @param  MnpServiceData        Pointer to the mnp service context data.\r
   @param  Nbuf                  Pointer to the NET_BUF to free.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 MnpFreeNbuf (\r
@@ -256,7 +348,7 @@ MnpFreeNbuf (
   NET_CHECK_SIGNATURE (MnpServiceData, MNP_SERVICE_DATA_SIGNATURE);\r
   ASSERT (Nbuf->RefCnt > 1);\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_RECYCLE);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
   NET_PUT_REF (Nbuf);\r
 \r
@@ -268,7 +360,7 @@ MnpFreeNbuf (
     NetbufQueAppend (&MnpServiceData->FreeNbufQue, Nbuf);\r
   }\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 }\r
 \r
 \r
@@ -276,7 +368,8 @@ MnpFreeNbuf (
   Initialize the mnp service context data.\r
 \r
   @param  MnpServiceData        Pointer to the mnp service context data.\r
-  @param  Snp                   Pointer to the simple network protocol.\r
+  @param  ImageHandle           The driver image handle.\r
+  @param  ControllerHandle      Handle of device to bind driver to.\r
 \r
   @retval EFI_SUCCESS           The mnp service context is initialized.\r
   @retval Other                 Some error occurs.\r
@@ -327,8 +420,8 @@ MnpInitializeServiceData (
   //\r
   // Initialize the lists.\r
   //\r
-  NetListInit (&MnpServiceData->GroupAddressList);\r
-  NetListInit (&MnpServiceData->ChildrenList);\r
+  InitializeListHead (&MnpServiceData->GroupAddressList);\r
+  InitializeListHead (&MnpServiceData->ChildrenList);\r
 \r
   //\r
   // Get the buffer length used to allocate NET_BUF to hold data received\r
@@ -337,7 +430,7 @@ MnpInitializeServiceData (
   MnpServiceData->BufferLength = MnpServiceData->Mtu + SnpMode->MediaHeaderSize + NET_ETHER_FCS_SIZE;\r
 \r
   //\r
-  // Make sure the protocol headers immediately following the media header \r
+  // Make sure the protocol headers immediately following the media header\r
   // 4-byte aligned\r
   //\r
   MnpServiceData->PaddingSize = (4 - SnpMode->MediaHeaderSize) & 0x3;\r
@@ -349,7 +442,7 @@ MnpInitializeServiceData (
   Status = MnpAddFreeNbuf (MnpServiceData, MNP_INIT_NET_BUFFER_NUM);\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpInitializeServiceData: MnpAddFreeNbuf failed, %r.\n", Status));\r
+    DEBUG ((EFI_D_ERROR, "MnpInitializeServiceData: MnpAddFreeNbuf failed, %r.\n", Status));\r
     goto ERROR;\r
   }\r
   //\r
@@ -365,10 +458,10 @@ MnpInitializeServiceData (
   //\r
   // Allocate buffer pool for tx.\r
   //\r
-  MnpServiceData->TxBuf = NetAllocatePool (MnpServiceData->Mtu + SnpMode->MediaHeaderSize);\r
+  MnpServiceData->TxBuf = AllocatePool (MnpServiceData->Mtu + SnpMode->MediaHeaderSize);\r
   if (MnpServiceData->TxBuf == NULL) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpInitializeServiceData: NetAllocatePool failed.\n"));\r
+    DEBUG ((EFI_D_ERROR, "MnpInitializeServiceData: AllocatePool failed.\n"));\r
     Status = EFI_OUT_OF_RESOURCES;\r
 \r
     goto ERROR;\r
@@ -379,14 +472,14 @@ MnpInitializeServiceData (
   //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
-                  NET_TPL_LOCK,\r
+                  TPL_CALLBACK,\r
                   MnpSystemPoll,\r
                   MnpServiceData,\r
                   &MnpServiceData->PollTimer\r
                   );\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpInitializeServiceData: CreateEvent for poll timer failed.\n"));\r
+    DEBUG ((EFI_D_ERROR, "MnpInitializeServiceData: CreateEvent for poll timer failed.\n"));\r
     goto ERROR;\r
   }\r
 \r
@@ -395,14 +488,14 @@ MnpInitializeServiceData (
   //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
-                  NET_TPL_TIMER,\r
+                  TPL_CALLBACK,\r
                   MnpCheckPacketTimeout,\r
                   MnpServiceData,\r
                   &MnpServiceData->TimeoutCheckTimer\r
                   );\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpInitializeServiceData: CreateEvent for packet timeout check failed.\n"));\r
+    DEBUG ((EFI_D_ERROR, "MnpInitializeServiceData: CreateEvent for packet timeout check failed.\n"));\r
     goto ERROR;\r
   }\r
 \r
@@ -411,14 +504,14 @@ MnpInitializeServiceData (
   //\r
   Status = gBS->CreateEvent (\r
                   EVT_TIMER,\r
-                  NET_TPL_TIMER,\r
+                  TPL_CALLBACK,\r
                   NULL,\r
                   NULL,\r
                   &MnpServiceData->TxTimeoutEvent\r
                   );\r
   if (EFI_ERROR (Status)) {\r
 \r
-    MNP_DEBUG_ERROR (("MnpInitializeServiceData: CreateEvent for tx timeout event failed.\n"));\r
+    DEBUG ((EFI_D_ERROR, "MnpInitializeServiceData: CreateEvent for tx timeout event failed.\n"));\r
   }\r
 \r
 ERROR:\r
@@ -439,7 +532,7 @@ ERROR:
 \r
     if (MnpServiceData->TxBuf != NULL) {\r
 \r
-      NetFreePool (MnpServiceData->TxBuf);\r
+      gBS->FreePool (MnpServiceData->TxBuf);\r
     }\r
 \r
     if (MnpServiceData->RxNbufCache != NULL) {\r
@@ -461,13 +554,13 @@ ERROR:
   Flush the mnp service context data.\r
 \r
   @param  MnpServiceData        Pointer to the mnp service context data.\r
-\r
-  @return None.\r
+  @param  ImageHandle           The driver image handle.\r
 \r
 **/\r
 VOID\r
 MnpFlushServiceData (\r
-  MNP_SERVICE_DATA  *MnpServiceData\r
+  IN MNP_SERVICE_DATA  *MnpServiceData,\r
+  IN EFI_HANDLE        ImageHandle\r
   )\r
 {\r
   NET_CHECK_SIGNATURE (MnpServiceData, MNP_SERVICE_DATA_SIGNATURE);\r
@@ -475,7 +568,7 @@ MnpFlushServiceData (
   //\r
   // The GroupAddressList must be empty.\r
   //\r
-  ASSERT (NetListIsEmpty (&MnpServiceData->GroupAddressList));\r
+  ASSERT (IsListEmpty (&MnpServiceData->GroupAddressList));\r
 \r
   //\r
   // Close the event.\r
@@ -487,7 +580,7 @@ MnpFlushServiceData (
   //\r
   // Free the tx buffer.\r
   //\r
-  NetFreePool (MnpServiceData->TxBuf);\r
+  gBS->FreePool (MnpServiceData->TxBuf);\r
 \r
   //\r
   // Free the RxNbufCache.\r
@@ -502,11 +595,21 @@ MnpFlushServiceData (
 \r
   DEBUG_CODE (\r
 \r
-    if (MnpServiceData->NbufCnt != 0) {\r
+  if (MnpServiceData->NbufCnt != 0) {\r
 \r
-    MNP_DEBUG_WARN (("MnpFlushServiceData: Memory leak, MnpServiceData->NbufCnt != 0.\n"));\r
+    DEBUG ((EFI_D_WARN, "MnpFlushServiceData: Memory leak, MnpServiceData->NbufCnt != 0.\n"));\r
   }\r
   );\r
+\r
+  //\r
+  // Close the Simple Network Protocol.\r
+  //\r
+  gBS->CloseProtocol (\r
+        MnpServiceData->ControllerHandle,\r
+        &gEfiSimpleNetworkProtocolGuid,\r
+        ImageHandle,\r
+        MnpServiceData->ControllerHandle\r
+        );\r
 }\r
 \r
 \r
@@ -517,8 +620,6 @@ MnpFlushServiceData (
   @param  Instance              Pointer to the mnp instance context data to\r
                                 initialize.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 MnpInitializeInstanceData (\r
@@ -547,9 +648,9 @@ MnpInitializeInstanceData (
   //\r
   // Initialize the lists.\r
   //\r
-  NetListInit (&Instance->GroupCtrlBlkList);\r
-  NetListInit (&Instance->RcvdPacketQueue);\r
-  NetListInit (&Instance->RxDeliveredPacketQueue);\r
+  InitializeListHead (&Instance->GroupCtrlBlkList);\r
+  InitializeListHead (&Instance->RcvdPacketQueue);\r
+  InitializeListHead (&Instance->RxDeliveredPacketQueue);\r
 \r
   //\r
   // Initialize the RxToken Map.\r
@@ -601,25 +702,24 @@ MnpTokenExist (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
   Cancel the token specified by Arg if it matches the token in Item.\r
 \r
-  @param  Map                   Pointer to the NET_MAP.\r
-  @param  Item                  Pointer to the NET_MAP_ITEM\r
-  @param  Arg                   Pointer to the Arg, it's a pointer to the token to\r
-                                cancel.\r
+  @param  Map               Pointer to the NET_MAP.\r
+  @param  Item              Pointer to the NET_MAP_ITEM\r
+  @param  Arg               Pointer to the Arg, it's a pointer to the token to \r
+                            cancel.\r
 \r
-  @retval EFI_SUCCESS           The Arg is NULL, and the token in Item is\r
-                                cancelled, or the Arg isn't NULL, and the token in\r
-                                Item is different from the Arg.\r
-  @retval EFI_ABORTED           The Arg isn't NULL, the token in Item mathces the\r
-                                Arg, and the token is cancelled.\r
+  @retval EFI_SUCCESS       The Arg is NULL, and the token in Item is cancelled, \r
+                            or the Arg isn't NULL, and the token in Item is\r
+                            different from the Arg.\r
+  @retval EFI_ABORTED       The Arg isn't NULL, the token in Item mathces the\r
+                            Arg, and the token is cancelled.\r
 \r
 **/\r
 EFI_STATUS\r
 MnpCancelTokens (\r
-  IN NET_MAP       *Map,\r
+  IN OUT NET_MAP   *Map,\r
   IN NET_MAP_ITEM  *Item,\r
   IN VOID          *Arg\r
   )\r
@@ -666,7 +766,6 @@ MnpCancelTokens (
   @retval Other                 Some error occurs.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 MnpStartSnp (\r
   IN EFI_SIMPLE_NETWORK_PROTOCOL  *Snp\r
@@ -701,7 +800,6 @@ MnpStartSnp (
   @retval Other                 Some error occurs.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 MnpStopSnp (\r
   IN EFI_SIMPLE_NETWORK_PROTOCOL  *Snp\r
@@ -733,7 +831,7 @@ MnpStopSnp (
 \r
   @param  MnpServiceData        Pointer to the mnp service context data.\r
   @param  IsConfigUpdate        The instance is reconfigured or it's the first time\r
-                                 the instanced is configured.\r
+                                the instanced is configured.\r
   @param  EnableSystemPoll      Enable the system polling or not.\r
 \r
   @retval EFI_SUCCESS           The managed network is started and some\r
@@ -741,7 +839,6 @@ MnpStopSnp (
   @retval Other                 Some error occurs.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 MnpStart (\r
   IN MNP_SERVICE_DATA  *MnpServiceData,\r
@@ -769,7 +866,7 @@ MnpStart (
       Status = MnpStartSnp (MnpServiceData->Snp);\r
       if (EFI_ERROR (Status)) {\r
 \r
-        MNP_DEBUG_ERROR (("MnpStart: MnpStartSnp failed, %r.\n", Status));\r
+        DEBUG ((EFI_D_ERROR, "MnpStart: MnpStartSnp failed, %r.\n", Status));\r
         goto ErrorExit;\r
       }\r
 \r
@@ -783,8 +880,9 @@ MnpStart (
                       );\r
       if (EFI_ERROR (Status)) {\r
 \r
-        MNP_DEBUG_ERROR (\r
-          ("MnpStart, gBS->SetTimer for TimeoutCheckTimer %r.\n",\r
+        DEBUG (\r
+          (EFI_D_ERROR,\r
+          "MnpStart, gBS->SetTimer for TimeoutCheckTimer %r.\n",\r
           Status)\r
           );\r
         goto ErrorExit;\r
@@ -802,7 +900,7 @@ MnpStart (
     Status      = gBS->SetTimer (MnpServiceData->PollTimer, TimerOpType, MNP_SYS_POLL_INTERVAL);\r
     if (EFI_ERROR (Status)) {\r
 \r
-      MNP_DEBUG_ERROR (("MnpStart: gBS->SetTimer for PollTimer failed, %r.\n", Status));\r
+      DEBUG ((EFI_D_ERROR, "MnpStart: gBS->SetTimer for PollTimer failed, %r.\n", Status));\r
       goto ErrorExit;\r
     }\r
 \r
@@ -829,7 +927,6 @@ ErrorExit:
   @retval Other                 Some error occurs.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 MnpStop (\r
   IN MNP_SERVICE_DATA  *MnpServiceData\r
@@ -889,8 +986,6 @@ MnpStop (
 \r
   @param  Instance              Pointer to the mnp instance context data.\r
 \r
-  @return None.\r
-\r
 **/\r
 VOID\r
 MnpFlushRcvdDataQueue (\r
@@ -902,9 +997,9 @@ MnpFlushRcvdDataQueue (
 \r
   NET_CHECK_SIGNATURE (Instance, MNP_INSTANCE_DATA_SIGNATURE);\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_RECYCLE);\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
-  while (!NetListIsEmpty (&Instance->RcvdPacketQueue)) {\r
+  while (!IsListEmpty (&Instance->RcvdPacketQueue)) {\r
     //\r
     // Remove all the Wraps.\r
     //\r
@@ -919,7 +1014,7 @@ MnpFlushRcvdDataQueue (
 \r
   ASSERT (Instance->RcvdPacketQueueSize == 0);\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 }\r
 \r
 \r
@@ -1062,163 +1157,6 @@ MnpConfigureInstance (
 }\r
 \r
 \r
-/**\r
-  Configure the Snp receive filters according to the instances' receive filter\r
-  settings.\r
-\r
-  @param  MnpServiceData        Pointer to the mnp service context data.\r
-\r
-  @retval EFI_SUCCESS           The receive filters is configured.\r
-  @retval EFI_OUT_OF_RESOURCES  The receive filters can't be configured due to lack\r
-                                of memory resource.\r
-\r
-**/\r
-STATIC\r
-EFI_STATUS\r
-MnpConfigReceiveFilters (\r
-  IN MNP_SERVICE_DATA  *MnpServiceData\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL *Snp;\r
-  EFI_MAC_ADDRESS             *MCastFilter;\r
-  UINT32                      MCastFilterCnt;\r
-  UINT32                      EnableFilterBits;\r
-  UINT32                      DisableFilterBits;\r
-  BOOLEAN                     ResetMCastFilters;\r
-  NET_LIST_ENTRY              *Entry;\r
-  UINT32                      Index;\r
-  MNP_GROUP_ADDRESS           *GroupAddress;\r
-\r
-  NET_CHECK_SIGNATURE (MnpServiceData, MNP_SERVICE_DATA_SIGNATURE);\r
-\r
-  Snp = MnpServiceData->Snp;\r
-\r
-  //\r
-  // Initialize the enable filter and disable filter.\r
-  //\r
-  EnableFilterBits  = 0;\r
-  DisableFilterBits = Snp->Mode->ReceiveFilterMask;\r
-\r
-  if (MnpServiceData->UnicastCount != 0) {\r
-    //\r
-    // Enable unicast if any instance wants to receive unicast.\r
-    //\r
-    EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;\r
-  }\r
-\r
-  if (MnpServiceData->BroadcastCount != 0) {\r
-    //\r
-    // Enable broadcast if any instance wants to receive broadcast.\r
-    //\r
-    EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;\r
-  }\r
-\r
-  MCastFilter       = NULL;\r
-  MCastFilterCnt    = 0;\r
-  ResetMCastFilters = TRUE;\r
-\r
-  if ((MnpServiceData->MulticastCount != 0) && (MnpServiceData->GroupAddressCount != 0)) {\r
-    //\r
-    // There are instances configured to receive multicast and already some group\r
-    // addresses are joined.\r
-    //\r
-\r
-    ResetMCastFilters = FALSE;\r
-\r
-    if (MnpServiceData->GroupAddressCount <= Snp->Mode->MaxMCastFilterCount) {\r
-      //\r
-      // The joind group address is less than simple network's maximum count.\r
-      // Just configure the snp to do the multicast filtering.\r
-      //\r
-\r
-      EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST;\r
-\r
-      //\r
-      // Allocate pool for the mulicast addresses.\r
-      //\r
-      MCastFilterCnt  = MnpServiceData->GroupAddressCount;\r
-      MCastFilter     = NetAllocatePool (sizeof (EFI_MAC_ADDRESS) * MCastFilterCnt);\r
-      if (MCastFilter == NULL) {\r
-\r
-        MNP_DEBUG_ERROR (("MnpConfigReceiveFilters: Failed to allocate memory resource for MCastFilter.\n"));\r
-        return EFI_OUT_OF_RESOURCES;\r
-      }\r
-\r
-      //\r
-      // Fill the multicast HW address buffer.\r
-      //\r
-      Index = 0;\r
-      NET_LIST_FOR_EACH (Entry, &MnpServiceData->GroupAddressList) {\r
-\r
-        GroupAddress            = NET_LIST_USER_STRUCT (Entry, MNP_GROUP_ADDRESS, AddrEntry);\r
-        CopyMem (MCastFilter + Index, &GroupAddress->Address, sizeof (*(MCastFilter + Index)));\r
-        Index++;\r
-\r
-        ASSERT (Index <= MCastFilterCnt);\r
-      }\r
-    } else {\r
-      //\r
-      // The maximum multicast is reached, set the filter to be promiscuous\r
-      // multicast.\r
-      //\r
-\r
-      if (Snp->Mode->ReceiveFilterMask & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) {\r
-        EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;\r
-      } else {\r
-        //\r
-        // Either MULTICAST or PROMISCUOUS_MULTICAST is not supported by Snp,\r
-        // set the NIC to be promiscuous although this will tremendously degrade\r
-        // the performance.\r
-        //\r
-        EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;\r
-      }\r
-    }\r
-  }\r
-\r
-  if (MnpServiceData->PromiscuousCount != 0) {\r
-    //\r
-    // Enable promiscuous if any instance wants to receive promiscuous.\r
-    //\r
-    EnableFilterBits |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;\r
-  }\r
-\r
-  //\r
-  // Set the disable filter.\r
-  //\r
-  DisableFilterBits ^= EnableFilterBits;\r
-\r
-  //\r
-  // Configure the receive filters of SNP.\r
-  //\r
-  Status = Snp->ReceiveFilters (\r
-                  Snp,\r
-                  EnableFilterBits,\r
-                  DisableFilterBits,\r
-                  ResetMCastFilters,\r
-                  MCastFilterCnt,\r
-                  MCastFilter\r
-                  );\r
-  DEBUG_CODE (\r
-    if (EFI_ERROR (Status)) {\r
-\r
-    MNP_DEBUG_ERROR (\r
-      ("MnpConfigReceiveFilters: Snp->ReceiveFilters failed, %r.\n",\r
-      Status)\r
-      );\r
-  }\r
-  );\r
-\r
-  if (MCastFilter != NULL) {\r
-    //\r
-    // Free the buffer used to hold the group addresses.\r
-    //\r
-    NetFreePool (MCastFilter);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
 \r
 /**\r
   Add a group address control block which controls the MacAddress for\r
@@ -1234,7 +1172,6 @@ MnpConfigReceiveFilters (
   @retval EFI_OUT_OF_RESOURCE   Failed due to lack of memory resources.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 MnpGroupOpAddCtrlBlk (\r
   IN MNP_INSTANCE_DATA        *Instance,\r
@@ -1258,17 +1195,17 @@ MnpGroupOpAddCtrlBlk (
     //\r
     // Allocate a new GroupAddress to be added into MNP's GroupAddressList.\r
     //\r
-    GroupAddress = NetAllocatePool (sizeof (MNP_GROUP_ADDRESS));\r
+    GroupAddress = AllocatePool (sizeof (MNP_GROUP_ADDRESS));\r
     if (GroupAddress == NULL) {\r
 \r
-      MNP_DEBUG_ERROR (("MnpGroupOpFormCtrlBlk: Failed to allocate memory resource.\n"));\r
+      DEBUG ((EFI_D_ERROR, "MnpGroupOpFormCtrlBlk: Failed to allocate memory resource.\n"));\r
 \r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
     CopyMem (&GroupAddress->Address, MacAddress, sizeof (GroupAddress->Address));\r
     GroupAddress->RefCnt  = 0;\r
-    NetListInsertTail (\r
+    InsertTailList (\r
       &MnpServiceData->GroupAddressList,\r
       &GroupAddress->AddrEntry\r
       );\r
@@ -1284,7 +1221,7 @@ MnpGroupOpAddCtrlBlk (
   // Add the CtrlBlk into the instance's GroupCtrlBlkList.\r
   //\r
   CtrlBlk->GroupAddress = GroupAddress;\r
-  NetListInsertTail (&Instance->GroupCtrlBlkList, &CtrlBlk->CtrlBlkEntry);\r
+  InsertTailList (&Instance->GroupCtrlBlkList, &CtrlBlk->CtrlBlkEntry);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -1300,7 +1237,6 @@ MnpGroupOpAddCtrlBlk (
   @return The group address controlled by the control block is no longer used or not.\r
 \r
 **/\r
-STATIC\r
 BOOLEAN\r
 MnpGroupOpDelCtrlBlk (\r
   IN MNP_INSTANCE_DATA        *Instance,\r
@@ -1319,8 +1255,8 @@ MnpGroupOpDelCtrlBlk (
   // Remove and free the CtrlBlk.\r
   //\r
   GroupAddress = CtrlBlk->GroupAddress;\r
-  NetListRemoveEntry (&CtrlBlk->CtrlBlkEntry);\r
-  NetFreePool (CtrlBlk);\r
+  RemoveEntryList (&CtrlBlk->CtrlBlkEntry);\r
+  gBS->FreePool (CtrlBlk);\r
 \r
   ASSERT (GroupAddress->RefCnt > 0);\r
 \r
@@ -1334,8 +1270,8 @@ MnpGroupOpDelCtrlBlk (
     // Free this GroupAddress entry if no instance uses it.\r
     //\r
     MnpServiceData->GroupAddressCount--;\r
-    NetListRemoveEntry (&GroupAddress->AddrEntry);\r
-    NetFreePool (GroupAddress);\r
+    RemoveEntryList (&GroupAddress->AddrEntry);\r
+    gBS->FreePool (GroupAddress);\r
 \r
     return TRUE;\r
   }\r
@@ -1367,8 +1303,8 @@ MnpGroupOp (
   )\r
 {\r
   MNP_SERVICE_DATA        *MnpServiceData;\r
-  NET_LIST_ENTRY          *Entry;\r
-  NET_LIST_ENTRY          *NextEntry;\r
+  LIST_ENTRY              *Entry;\r
+  LIST_ENTRY              *NextEntry;\r
   MNP_GROUP_ADDRESS       *GroupAddress;\r
   EFI_SIMPLE_NETWORK_MODE *SnpMode;\r
   MNP_GROUP_CONTROL_BLOCK *NewCtrlBlk;\r
@@ -1392,10 +1328,10 @@ MnpGroupOp (
     //\r
     // Allocate memory for the control block.\r
     //\r
-    NewCtrlBlk    = NetAllocatePool (sizeof (MNP_GROUP_CONTROL_BLOCK));\r
+    NewCtrlBlk    = AllocatePool (sizeof (MNP_GROUP_CONTROL_BLOCK));\r
     if (NewCtrlBlk == NULL) {\r
 \r
-      MNP_DEBUG_ERROR (("MnpGroupOp: Failed to allocate memory resource.\n"));\r
+      DEBUG ((EFI_D_ERROR, "MnpGroupOp: Failed to allocate memory resource.\n"));\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
@@ -1404,7 +1340,7 @@ MnpGroupOp (
       // Check whether the MacAddress is already joined by other instances.\r
       //\r
       GroupAddress = NET_LIST_USER_STRUCT (Entry, MNP_GROUP_ADDRESS, AddrEntry);\r
-      if (0 == NetCompareMem (\r
+      if (0 == CompareMem (\r
                 MacAddress,\r
                 &GroupAddress->Address,\r
                 SnpMode->HwAddressSize\r