/** @file\r
-\r
-Copyright (c) 2005 - 2007, Intel Corporation\r
+ Implementation of Managed Network Protocol private services.\r
+ \r
+Copyright (c) 2005 - 2008, 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
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
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[in] 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
+ @param[in] MnpServiceData Pointer to the MNP_SERVICE_DATA.\r
+ @param[in] 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
\r
for (Index = 0; Index < Count; Index++) {\r
\r
- Nbuf = NetbufAlloc (MnpServiceData->BufferLength);\r
+ 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
\r
+ if (MnpServiceData->PaddingSize > 0) {\r
+ //\r
+ // Pad padding bytes before the media header\r
+ //\r
+ NetbufAllocSpace (Nbuf, MnpServiceData->PaddingSize, NET_BUF_TAIL);\r
+ NetbufTrim (Nbuf, MnpServiceData->PaddingSize, NET_BUF_HEAD);\r
+ }\r
+\r
NetbufQueAppend (&MnpServiceData->FreeNbufQue, Nbuf);\r
}\r
\r
in the queue, first try to allocate some and add them into the queue, then\r
fetch the NET_BUF from the updated FreeNbufQue.\r
\r
- @param MnpServiceData Pointer to the MNP_SERVICE_DATA.\r
+ @param[in] 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
\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
\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
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
}\r
\r
ON_EXIT:\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
\r
return Nbuf;\r
}\r
\r
@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
**/\r
VOID\r
MnpFreeNbuf (\r
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
NetbufQueAppend (&MnpServiceData->FreeNbufQue, Nbuf);\r
}\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
}\r
\r
\r
/**\r
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[in] MnpServiceData Pointer to the mnp service context data.\r
+ @param[in] ImageHandle The driver image handle.\r
+ @param[in] 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
//\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
//\r
MnpServiceData->BufferLength = MnpServiceData->Mtu + SnpMode->MediaHeaderSize + NET_ETHER_FCS_SIZE;\r
\r
+ //\r
+ // Make sure the protocol headers immediately following the media header\r
+ // 4-byte aligned\r
+ //\r
+ MnpServiceData->PaddingSize = (4 - SnpMode->MediaHeaderSize) & 0x3;\r
+\r
//\r
// Initialize the FreeNetBufQue and pre-allocate some NET_BUFs.\r
//\r
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
//\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
//\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
//\r
Status = gBS->CreateEvent (\r
EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
- NET_TPL_EVENT,\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
//\r
Status = gBS->CreateEvent (\r
EVT_TIMER,\r
- NET_TPL_SLOW_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
\r
if (MnpServiceData->TxBuf != NULL) {\r
\r
- NetFreePool (MnpServiceData->TxBuf);\r
+ gBS->FreePool (MnpServiceData->TxBuf);\r
}\r
\r
if (MnpServiceData->RxNbufCache != NULL) {\r
Flush the mnp service context data.\r
\r
@param MnpServiceData Pointer to the mnp service context data.\r
-\r
- @return None.\r
-\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
//\r
// The GroupAddressList must be empty.\r
//\r
- ASSERT (NetListIsEmpty (&MnpServiceData->GroupAddressList));\r
+ ASSERT (IsListEmpty (&MnpServiceData->GroupAddressList));\r
\r
//\r
// Close the event.\r
//\r
// Free the tx buffer.\r
//\r
- NetFreePool (MnpServiceData->TxBuf);\r
+ gBS->FreePool (MnpServiceData->TxBuf);\r
\r
//\r
// Free the RxNbufCache.\r
\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
/**\r
Initialize the mnp instance context data.\r
\r
- @param MnpServiceData Pointer to the mnp service context data.\r
- @param Instance Pointer to the mnp instance context data to\r
+ @param[in] MnpServiceData Pointer to the mnp service context data.\r
+ @param[in] Instance Pointer to the mnp instance context data to\r
initialize.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
MnpInitializeInstanceData (\r
//\r
// Copy the MNP Protocol interfaces from the template.\r
//\r
- CopyMem (&Instance->ManagedNetwork, &mMnpProtocolTemplate, sizeof (EFI_MANAGED_NETWORK_PROTOCOL));\r
+ CopyMem (&Instance->ManagedNetwork, &mMnpProtocolTemplate, sizeof (Instance->ManagedNetwork));\r
\r
//\r
// Copy the default config data.\r
//\r
- CopyMem (&Instance->ConfigData, &mMnpDefaultConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA));\r
+ CopyMem (&Instance->ConfigData, &mMnpDefaultConfigData, sizeof (Instance->ConfigData));\r
\r
//\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
/**\r
Check whether the token specified by Arg maches 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
+ @param[in] Map Pointer to the NET_MAP.\r
+ @param[in] Item Pointer to the NET_MAP_ITEM\r
+ @param[in] Arg Pointer to the Arg, it's a pointer to the token to\r
check.\r
\r
@retval EFI_SUCCESS The token specified by Arg is different from the\r
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
+ @param[in, out] Map Pointer to the NET_MAP.\r
+ @param[in] Item Pointer to the NET_MAP_ITEM\r
+ @param[in] 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
TokenToCancel = (EFI_MANAGED_NETWORK_COMPLETION_TOKEN *) Item->Key;\r
\r
//\r
- // Cancel this token with status set to EFI_ABORTED.\r
+ // Remove the item from the map.\r
//\r
- TokenToCancel->Status = EFI_ABORTED;\r
- gBS->SignalEvent (TokenToCancel->Event);\r
+ NetMapRemoveItem (Map, Item, NULL);\r
\r
//\r
- // Remove the item from the map.\r
+ // Cancel this token with status set to EFI_ABORTED.\r
//\r
- NetMapRemoveItem (Map, Item, NULL);\r
+ TokenToCancel->Status = EFI_ABORTED;\r
+ gBS->SignalEvent (TokenToCancel->Event);\r
\r
if (Arg != NULL) {\r
//\r
/**\r
Start and initialize the simple network.\r
\r
- @param Snp Pointer to the simple network protocol.\r
+ @param[in] Snp Pointer to the simple network protocol.\r
\r
@retval EFI_SUCCESS The simple network protocol is started.\r
@retval Other Some error occurs.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
MnpStartSnp (\r
IN EFI_SIMPLE_NETWORK_PROTOCOL *Snp\r
/**\r
Stop the simple network.\r
\r
- @param Snp Pointer to the simple network protocol.\r
+ @param[in] Snp Pointer to the simple network protocol.\r
\r
@retval EFI_SUCCESS The simple network is stopped.\r
@retval Other Some error occurs.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
MnpStopSnp (\r
IN EFI_SIMPLE_NETWORK_PROTOCOL *Snp\r
Start the managed network, this function is called when one instance is configured\r
or reconfigured.\r
\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
- @param EnableSystemPoll Enable the system polling or not.\r
+ @param[in] MnpServiceData Pointer to the mnp service context data.\r
+ @param[in] IsConfigUpdate The instance is reconfigured or it's the first time\r
+ the instanced is configured.\r
+ @param[in] EnableSystemPoll Enable the system polling or not.\r
\r
@retval EFI_SUCCESS The managed network is started and some\r
configuration is updated.\r
@retval Other Some error occurs.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
MnpStart (\r
IN MNP_SERVICE_DATA *MnpServiceData,\r
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
);\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
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
/**\r
Stop the managed network.\r
\r
- @param MnpServiceData Pointer to the mnp service context data.\r
+ @param[in] MnpServiceData Pointer to the mnp service context data.\r
\r
@retval EFI_SUCCESS The managed network is stopped.\r
@retval Other Some error occurs.\r
\r
**/\r
-STATIC\r
EFI_STATUS\r
MnpStop (\r
IN MNP_SERVICE_DATA *MnpServiceData\r
\r
@param Instance Pointer to the mnp instance context data.\r
\r
- @return None.\r
-\r
**/\r
VOID\r
MnpFlushRcvdDataQueue (\r
\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
\r
ASSERT (Instance->RcvdPacketQueueSize == 0);\r
\r
- NET_RESTORE_TPL (OldTpl);\r
+ gBS->RestoreTPL (OldTpl);\r
}\r
\r
\r
/**\r
Configure the Instance using ConfigData.\r
\r
- @param Instance Pointer to the mnp instance context data.\r
- @param ConfigData Pointer to the configuration data used to configure\r
+ @param[in] Instance Pointer to the mnp instance context data.\r
+ @param[in] ConfigData Pointer to the configuration data used to configure\r
the isntance.\r
\r
@retval EFI_SUCCESS The Instance is configured.\r
\r
if (ConfigData == NULL) {\r
\r
- NetMapIterate (&Instance->RxTokenMap, MnpCancelTokens, NULL);\r
+ Instance->ManagedNetwork.Cancel (&Instance->ManagedNetwork, NULL);\r
}\r
\r
if (!NewConfigData->EnableMulticastReceive) {\r
//\r
// Save the new configuration data.\r
//\r
- CopyMem (OldConfigData, NewConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA));\r
+ CopyMem (OldConfigData, NewConfigData, sizeof (*OldConfigData));\r
\r
Instance->Configured = (BOOLEAN) (ConfigData != NULL);\r
\r
}\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 (EFI_MAC_ADDRESS));\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
this instance.\r
\r
- @param Instance Pointer to the mnp instance context data.\r
- @param CtrlBlk Pointer to the group address control block.\r
- @param GroupAddress Pointer to the group adress.\r
- @param MacAddress Pointer to the mac address.\r
- @param HwAddressSize The hardware address size.\r
+ @param[in] Instance Pointer to the mnp instance context data.\r
+ @param[in] CtrlBlk Pointer to the group address control block.\r
+ @param[in] GroupAddress Pointer to the group adress.\r
+ @param[in] MacAddress Pointer to the mac address.\r
+ @param[in] HwAddressSize The hardware address size.\r
\r
@retval EFI_SUCCESS The group address control block is added.\r
@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
//\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 (EFI_MAC_ADDRESS));\r
+ CopyMem (&GroupAddress->Address, MacAddress, sizeof (GroupAddress->Address));\r
GroupAddress->RefCnt = 0;\r
- NetListInsertTail (\r
+ InsertTailList (\r
&MnpServiceData->GroupAddressList,\r
&GroupAddress->AddrEntry\r
);\r
// 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
Delete a group control block from the instance. If the controlled group address's\r
reference count reaches zero, the group address is removed too.\r
\r
- @param Instance Pointer to the instance context data.\r
- @param CtrlBlk Pointer to the group control block to delete.\r
+ @param[in] Instance Pointer to the instance context data.\r
+ @param[in] CtrlBlk Pointer to the group control block to delete.\r
\r
@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
// 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
// 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
/**\r
Do the group operations for this instance.\r
\r
- @param Instance Pointer to the instance context data.\r
- @param JoinFlag Set to TRUE to join a group. Set to TRUE to leave a\r
+ @param[in] Instance Pointer to the instance context data.\r
+ @param[in] JoinFlag Set to TRUE to join a group. Set to TRUE to leave a\r
group/groups.\r
- @param MacAddress Pointer to the group address to join or leave.\r
- @param CtrlBlk Pointer to the group control block if JoinFlag if\r
+ @param[in] MacAddress Pointer to the group address to join or leave.\r
+ @param[in] CtrlBlk Pointer to the group control block if JoinFlag if\r
FALSE.\r
\r
@retval EFI_SUCCESS The group operation finished.\r
)\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
//\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
// 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