/** @file\r
-Copyright (c) 2004 - 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
+ Implementation of managing the multicast receive filters of a network\r
+ interface.\r
+\r
+Copyright (c) 2004 - 2016, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials are licensed and made available under the \r
+terms and conditions of the BSD License which accompanies this distribution. The \r
+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
- receive_filters.c\r
-\r
-Abstract:\r
-\r
-Revision history:\r
- 2000-Feb-17 M(f)J Genesis.\r
-\r
**/\r
\r
\r
#include "Snp.h"\r
\r
/**\r
- this routine calls undi to enable the receive filters.\r
-\r
- @param snp pointer to snp driver structure\r
- @param EnableFlags bit mask for enabling the receive filters\r
- @param MCastAddressCount multicast address count for a new multicast address\r
- list\r
- @param MCastAddressList list of new multicast addresses\r
-\r
+ Call undi to enable the receive filters.\r
+\r
+ @param Snp Pointer to snp driver structure.\r
+ @param EnableFlags Bit mask for enabling the receive filters.\r
+ @param MCastAddressCount Multicast address count for a new multicast address\r
+ list.\r
+ @param MCastAddressList List of new multicast addresses. \r
+ \r
+ @retval EFI_SUCCESS The multicast receive filter list was updated.\r
+ @retval EFI_INVALID_PARAMETER Invalid UNDI command.\r
+ @retval EFI_UNSUPPORTED Command is not supported by UNDI.\r
+ @retval EFI_DEVICE_ERROR Fail to execute UNDI command.\r
\r
**/\r
EFI_STATUS\r
-pxe_rcvfilter_enable (\r
- SNP_DRIVER *snp,\r
+PxeRecvFilterEnable (\r
+ SNP_DRIVER *Snp,\r
UINT32 EnableFlags,\r
UINTN MCastAddressCount,\r
EFI_MAC_ADDRESS *MCastAddressList\r
)\r
{\r
- snp->cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS;\r
- snp->cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_ENABLE;\r
- snp->cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
- snp->cdb.DBsize = PXE_DBSIZE_NOT_USED;\r
- snp->cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
- snp->cdb.DBaddr = PXE_DBADDR_NOT_USED;\r
- snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
- snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
- snp->cdb.IFnum = snp->if_num;\r
- snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
+ Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS;\r
+ Snp->Cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_ENABLE;\r
+ Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
+ Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED;\r
+ Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
+ Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED;\r
+ Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
+ Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
+ Snp->Cdb.IFnum = Snp->IfNum;\r
+ Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
\r
if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_UNICAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST;\r
}\r
\r
if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST;\r
}\r
\r
if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS;\r
}\r
\r
if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST;\r
}\r
\r
if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST;\r
}\r
\r
if (MCastAddressCount != 0) {\r
- snp->cdb.CPBsize = (UINT16) (MCastAddressCount * sizeof (EFI_MAC_ADDRESS));\r
- snp->cdb.CPBaddr = (UINT64)(UINTN) snp->cpb;\r
- CopyMem (snp->cpb, MCastAddressList, snp->cdb.CPBsize);\r
+ Snp->Cdb.CPBsize = (UINT16) (MCastAddressCount * sizeof (EFI_MAC_ADDRESS));\r
+ Snp->Cdb.CPBaddr = (UINT64)(UINTN)Snp->Cpb;\r
+ CopyMem (Snp->Cpb, MCastAddressList, Snp->Cdb.CPBsize);\r
}\r
//\r
// Issue UNDI command and check result.\r
//\r
DEBUG ((EFI_D_NET, "\nsnp->undi.receive_filters() "));\r
\r
- (*snp->issue_undi32_command) ((UINT64)(UINTN) &snp->cdb);\r
+ (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);\r
\r
- if (snp->cdb.StatCode != EFI_SUCCESS) {\r
+ if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) {\r
//\r
// UNDI command failed. Return UNDI status to caller.\r
//\r
DEBUG (\r
(EFI_D_ERROR,\r
"\nsnp->undi.receive_filters() %xh:%xh\n",\r
- snp->cdb.StatFlags,\r
- snp->cdb.StatCode)\r
+ Snp->Cdb.StatFlags,\r
+ Snp->Cdb.StatCode)\r
);\r
\r
- switch (snp->cdb.StatCode) {\r
+ switch (Snp->Cdb.StatCode) {\r
case PXE_STATCODE_INVALID_CDB:\r
case PXE_STATCODE_INVALID_CPB:\r
case PXE_STATCODE_INVALID_PARAMETER:\r
}\r
\r
/**\r
- this routine calls undi to disable the receive filters.\r
+ Call undi to disable the receive filters.\r
\r
- @param snp pointer to snp driver structure\r
- @param DisableFlags bit mask for disabling the receive filters\r
- @param ResetMCastList boolean flag to reset/delete the multicast filter list\r
+ @param Snp Pointer to snp driver structure\r
+ @param DisableFlags Bit mask for disabling the receive filters\r
+ @param ResetMCastList Boolean flag to reset/delete the multicast filter \r
+ list.\r
\r
-\r
-**/\r
+ @retval EFI_SUCCESS The multicast receive filter list was updated.\r
+ @retval EFI_DEVICE_ERROR Fail to execute UNDI command.\r
+ \r
+**/ \r
EFI_STATUS\r
-pxe_rcvfilter_disable (\r
- SNP_DRIVER *snp,\r
+PxeRecvFilterDisable (\r
+ SNP_DRIVER *Snp,\r
UINT32 DisableFlags,\r
BOOLEAN ResetMCastList\r
)\r
{\r
- snp->cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS;\r
- snp->cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
- snp->cdb.DBsize = PXE_DBSIZE_NOT_USED;\r
- snp->cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
- snp->cdb.DBaddr = PXE_DBADDR_NOT_USED;\r
- snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
- snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
- snp->cdb.IFnum = snp->if_num;\r
- snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
-\r
- snp->cdb.OpFlags = (UINT16) (DisableFlags ? PXE_OPFLAGS_RECEIVE_FILTER_DISABLE : PXE_OPFLAGS_NOT_USED);\r
+ Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS;\r
+ Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
+ Snp->Cdb.DBsize = PXE_DBSIZE_NOT_USED;\r
+ Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
+ Snp->Cdb.DBaddr = PXE_DBADDR_NOT_USED;\r
+ Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
+ Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
+ Snp->Cdb.IFnum = Snp->IfNum;\r
+ Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
+\r
+ Snp->Cdb.OpFlags = (UINT16) ((DisableFlags != 0) ? PXE_OPFLAGS_RECEIVE_FILTER_DISABLE : PXE_OPFLAGS_NOT_USED);\r
\r
if (ResetMCastList) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_RESET_MCAST_LIST;\r
}\r
\r
if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_UNICAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_UNICAST;\r
}\r
\r
if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST;\r
}\r
\r
if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS;\r
}\r
\r
if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST;\r
}\r
\r
if ((DisableFlags & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0) {\r
- snp->cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST;\r
+ Snp->Cdb.OpFlags |= PXE_OPFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST;\r
}\r
//\r
// Issue UNDI command and check result.\r
//\r
DEBUG ((EFI_D_NET, "\nsnp->undi.receive_filters() "));\r
\r
- (*snp->issue_undi32_command) ((UINT64)(UINTN) &snp->cdb);\r
+ (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);\r
\r
- if (snp->cdb.StatCode != EFI_SUCCESS) {\r
+ if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) {\r
//\r
// UNDI command failed. Return UNDI status to caller.\r
//\r
DEBUG (\r
(EFI_D_ERROR,\r
"\nsnp->undi.receive_filters() %xh:%xh\n",\r
- snp->cdb.StatFlags,\r
- snp->cdb.StatCode)\r
+ Snp->Cdb.StatFlags,\r
+ Snp->Cdb.StatCode)\r
);\r
\r
return EFI_DEVICE_ERROR;\r
}\r
\r
/**\r
- this routine calls undi to read the receive filters.\r
-\r
- @param snp pointer to snp driver structure\r
+ Call undi to read the receive filters.\r
\r
+ @param Snp Pointer to snp driver structure.\r
\r
+ @retval EFI_SUCCESS The receive filter was read.\r
+ @retval EFI_DEVICE_ERROR Fail to execute UNDI command. \r
+ \r
**/\r
EFI_STATUS\r
-pxe_rcvfilter_read (\r
- SNP_DRIVER *snp\r
+PxeRecvFilterRead (\r
+ SNP_DRIVER *Snp\r
)\r
{\r
- snp->cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS;\r
- snp->cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_READ;\r
- snp->cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
- snp->cdb.DBsize = (UINT16) (snp->mode.MaxMCastFilterCount * sizeof (EFI_MAC_ADDRESS));\r
- snp->cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
- if (snp->cdb.DBsize == 0) {\r
- snp->cdb.DBaddr = (UINT64)(UINTN) NULL;\r
+ Snp->Cdb.OpCode = PXE_OPCODE_RECEIVE_FILTERS;\r
+ Snp->Cdb.OpFlags = PXE_OPFLAGS_RECEIVE_FILTER_READ;\r
+ Snp->Cdb.CPBsize = PXE_CPBSIZE_NOT_USED;\r
+ Snp->Cdb.DBsize = (UINT16) (Snp->Mode.MaxMCastFilterCount * sizeof (EFI_MAC_ADDRESS));\r
+ Snp->Cdb.CPBaddr = PXE_CPBADDR_NOT_USED;\r
+ if (Snp->Cdb.DBsize == 0) {\r
+ Snp->Cdb.DBaddr = (UINT64)(UINTN) NULL;\r
} else {\r
- snp->cdb.DBaddr = (UINT64)(UINTN) snp->db;\r
- ZeroMem (snp->db, snp->cdb.DBsize);\r
+ Snp->Cdb.DBaddr = (UINT64)(UINTN) Snp->Db;\r
+ ZeroMem (Snp->Db, Snp->Cdb.DBsize);\r
}\r
\r
- snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
- snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
- snp->cdb.IFnum = snp->if_num;\r
- snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
+ Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
+ Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
+ Snp->Cdb.IFnum = Snp->IfNum;\r
+ Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
\r
DEBUG ((EFI_D_NET, "\nsnp->undi.receive_filters() "));\r
\r
- (*snp->issue_undi32_command) ((UINT64)(UINTN) &snp->cdb);\r
+ (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);\r
\r
- if (snp->cdb.StatCode != EFI_SUCCESS) {\r
+ if (Snp->Cdb.StatCode != PXE_STATCODE_SUCCESS) {\r
//\r
// UNDI command failed. Return UNDI status to caller.\r
//\r
DEBUG (\r
(EFI_D_ERROR,\r
"\nsnp->undi.receive_filters() %xh:%xh\n",\r
- snp->cdb.StatFlags,\r
- snp->cdb.StatCode)\r
+ Snp->Cdb.StatFlags,\r
+ Snp->Cdb.StatCode)\r
);\r
\r
return EFI_DEVICE_ERROR;\r
//\r
// Convert UNDI32 StatFlags to EFI SNP filter flags.\r
//\r
- snp->mode.ReceiveFilterSetting = 0;\r
+ Snp->Mode.ReceiveFilterSetting = 0;\r
\r
- if ((snp->cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_UNICAST) != 0) {\r
- snp->mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;\r
+ if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_UNICAST) != 0) {\r
+ Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_UNICAST;\r
}\r
\r
- if ((snp->cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST) != 0) {\r
- snp->mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;\r
+ if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_BROADCAST) != 0) {\r
+ Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_BROADCAST;\r
}\r
\r
- if ((snp->cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS) != 0) {\r
- snp->mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;\r
+ if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_PROMISCUOUS) != 0) {\r
+ Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS;\r
}\r
\r
- if ((snp->cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) {\r
- snp->mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;\r
+ if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_ALL_MULTICAST) != 0) {\r
+ Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_PROMISCUOUS_MULTICAST;\r
}\r
\r
- if ((snp->cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) != 0) {\r
- snp->mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST;\r
+ if ((Snp->Cdb.StatFlags & PXE_STATFLAGS_RECEIVE_FILTER_FILTERED_MULTICAST) != 0) {\r
+ Snp->Mode.ReceiveFilterSetting |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST;\r
}\r
\r
- CopyMem (snp->mode.MCastFilter, snp->db, snp->cdb.DBsize);\r
+ CopyMem (Snp->Mode.MCastFilter, Snp->Db, Snp->Cdb.DBsize);\r
\r
//\r
// Count number of active entries in multicast filter list.\r
\r
SetMem (&ZeroMacAddr, sizeof ZeroMacAddr, 0);\r
\r
- for (snp->mode.MCastFilterCount = 0;\r
- snp->mode.MCastFilterCount < snp->mode.MaxMCastFilterCount;\r
- snp->mode.MCastFilterCount++\r
+ for (Snp->Mode.MCastFilterCount = 0;\r
+ Snp->Mode.MCastFilterCount < Snp->Mode.MaxMCastFilterCount;\r
+ Snp->Mode.MCastFilterCount++\r
) {\r
if (CompareMem (\r
- &snp->mode.MCastFilter[snp->mode.MCastFilterCount],\r
+ &Snp->Mode.MCastFilter[Snp->Mode.MCastFilterCount],\r
&ZeroMacAddr,\r
sizeof ZeroMacAddr\r
) == 0) {\r
\r
\r
/**\r
- This is the SNP interface routine for reading/enabling/disabling the\r
- receive filters.\r
- This routine basically retrieves snp structure, checks the SNP state and\r
- checks the parameter validity, calls one of the above routines to actually\r
- do the work\r
-\r
- @param this context pointer\r
- @param EnableFlags bit mask for enabling the receive filters\r
- @param DisableFlags bit mask for disabling the receive filters\r
- @param ResetMCastList boolean flag to reset/delete the multicast filter list\r
- @param MCastAddressCount multicast address count for a new multicast address\r
- list\r
- @param MCastAddressList list of new multicast addresses\r
-\r
+ Manages the multicast receive filters of a network interface.\r
+ \r
+ This function is used enable and disable the hardware and software receive \r
+ filters for the underlying network device.\r
+ The receive filter change is broken down into three steps: \r
+ * The filter mask bits that are set (ON) in the Enable parameter are added to \r
+ the current receive filter settings. \r
+ * The filter mask bits that are set (ON) in the Disable parameter are subtracted\r
+ from the updated receive filter settings.\r
+ * If the resulting receive filter setting is not supported by the hardware a\r
+ more liberal setting is selected.\r
+ If the same bits are set in the Enable and Disable parameters, then the bits \r
+ in the Disable parameter takes precedence.\r
+ If the ResetMCastFilter parameter is TRUE, then the multicast address list \r
+ filter is disabled (irregardless of what other multicast bits are set in the \r
+ Enable and Disable parameters). The SNP->Mode->MCastFilterCount field is set \r
+ to zero. The Snp->Mode->MCastFilter contents are undefined.\r
+ After enabling or disabling receive filter settings, software should verify \r
+ the new settings by checking the Snp->Mode->ReceiveFilterSettings, \r
+ Snp->Mode->MCastFilterCount and Snp->Mode->MCastFilter fields.\r
+ Note: Some network drivers and/or devices will automatically promote receive \r
+ filter settings if the requested setting can not be honored. For example, if\r
+ a request for four multicast addresses is made and the underlying hardware \r
+ only supports two multicast addresses the driver might set the promiscuous \r
+ or promiscuous multicast receive filters instead. The receiving software is\r
+ responsible for discarding any extra packets that get through the hardware \r
+ receive filters.\r
+ Note: Note: To disable all receive filter hardware, the network driver must \r
+ be Shutdown() and Stopped(). Calling ReceiveFilters() with Disable set to\r
+ Snp->Mode->ReceiveFilterSettings will make it so no more packets are \r
+ returned by the Receive() function, but the receive hardware may still be \r
+ moving packets into system memory before inspecting and discarding them.\r
+ Unexpected system errors, reboots and hangs can occur if an OS is loaded \r
+ and the network devices are not Shutdown() and Stopped().\r
+ If ResetMCastFilter is TRUE, then the multicast receive filter list on the \r
+ network interface will be reset to the default multicast receive filter list.\r
+ If ResetMCastFilter is FALSE, and this network interface allows the multicast \r
+ receive filter list to be modified, then the MCastFilterCnt and MCastFilter \r
+ are used to update the current multicast receive filter list. The modified \r
+ receive filter list settings can be found in the MCastFilter field of \r
+ EFI_SIMPLE_NETWORK_MODE. If the network interface does not allow the multicast\r
+ receive filter list to be modified, then EFI_INVALID_PARAMETER will be returned.\r
+ If the driver has not been initialized, EFI_DEVICE_ERROR will be returned.\r
+ If the receive filter mask and multicast receive filter list have been \r
+ successfully updated on the network interface, EFI_SUCCESS will be returned.\r
+\r
+ @param This A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL instance.\r
+ @param Enable A bit mask of receive filters to enable on the network\r
+ interface.\r
+ @param Disable A bit mask of receive filters to disable on the network\r
+ interface. For backward compatibility with EFI 1.1 \r
+ platforms, the EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST bit\r
+ must be set when the ResetMCastFilter parameter is TRUE.\r
+ @param ResetMCastFilter Set to TRUE to reset the contents of the multicast \r
+ receive filters on the network interface to their \r
+ default values. \r
+ @param MCastFilterCnt Number of multicast HW MAC addresses in the new MCastFilter\r
+ list. This value must be less than or equal to the \r
+ MCastFilterCnt field of EFI_SIMPLE_NETWORK_MODE. \r
+ This field is optional if ResetMCastFilter is TRUE.\r
+ @param MCastFilter A pointer to a list of new multicast receive filter HW\r
+ MAC addresses. This list will replace any existing \r
+ multicast HW MAC address list. This field is optional \r
+ if ResetMCastFilter is TRUE.\r
+ \r
+ @retval EFI_SUCCESS The multicast receive filter list was updated.\r
+ @retval EFI_NOT_STARTED The network interface has not been started.\r
+ @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
+ * This is NULL\r
+ * There are bits set in Enable that are not set\r
+ in Snp->Mode->ReceiveFilterMask\r
+ * There are bits set in Disable that are not set\r
+ in Snp->Mode->ReceiveFilterMask\r
+ * Multicast is being enabled (the \r
+ EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST bit is \r
+ set in Enable, it is not set in Disable, and \r
+ ResetMCastFilter is FALSE) and MCastFilterCount\r
+ is zero\r
+ * Multicast is being enabled and MCastFilterCount\r
+ is greater than Snp->Mode->MaxMCastFilterCount\r
+ * Multicast is being enabled and MCastFilter is NULL\r
+ * Multicast is being enabled and one or more of\r
+ the addresses in the MCastFilter list are not\r
+ valid multicast MAC addresses\r
+ @retval EFI_DEVICE_ERROR One or more of the following conditions is TRUE:\r
+ * The network interface has been started but has\r
+ not been initialized\r
+ * An unexpected error was returned by the \r
+ underlying network driver or device\r
+ @retval EFI_UNSUPPORTED This function is not supported by the network\r
+ interface.\r
\r
**/\r
EFI_STATUS\r
EFIAPI\r
-snp_undi32_receive_filters (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL * this,\r
- IN UINT32 EnableFlags,\r
- IN UINT32 DisableFlags,\r
- IN BOOLEAN ResetMCastList,\r
- IN UINTN MCastAddressCount OPTIONAL,\r
- IN EFI_MAC_ADDRESS * MCastAddressList OPTIONAL\r
+SnpUndi32ReceiveFilters (\r
+ IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
+ IN UINT32 Enable,\r
+ IN UINT32 Disable,\r
+ IN BOOLEAN ResetMCastFilter,\r
+ IN UINTN MCastFilterCnt, OPTIONAL\r
+ IN EFI_MAC_ADDRESS *MCastFilter OPTIONAL\r
)\r
{\r
- SNP_DRIVER *snp;\r
+ SNP_DRIVER *Snp;\r
EFI_STATUS Status;\r
EFI_TPL OldTpl;\r
\r
- if (this == NULL) {\r
+ if (This == NULL) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (this);\r
+ Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This);\r
\r
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
\r
- switch (snp->mode.State) {\r
+ switch (Snp->Mode.State) {\r
case EfiSimpleNetworkInitialized:\r
break;\r
\r
// check if we are asked to enable or disable something that the UNDI\r
// does not even support!\r
//\r
- if (((EnableFlags &~snp->mode.ReceiveFilterMask) != 0) ||\r
- ((DisableFlags &~snp->mode.ReceiveFilterMask) != 0)) {\r
+ if (((Enable &~Snp->Mode.ReceiveFilterMask) != 0) ||\r
+ ((Disable &~Snp->Mode.ReceiveFilterMask) != 0)) {\r
Status = EFI_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
\r
- if (ResetMCastList) {\r
+ if (ResetMCastFilter) {\r
\r
- DisableFlags |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST & snp->mode.ReceiveFilterMask;\r
- MCastAddressCount = 0;\r
- MCastAddressList = NULL;\r
+ Disable |= EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST & Snp->Mode.ReceiveFilterMask;\r
+ MCastFilterCnt = 0;\r
+ MCastFilter = NULL;\r
} else {\r
- if (MCastAddressCount != 0) {\r
- if ((MCastAddressCount > snp->mode.MaxMCastFilterCount) ||\r
- (MCastAddressList == NULL)) {\r
+ if (MCastFilterCnt != 0) {\r
+ if ((MCastFilterCnt > Snp->Mode.MaxMCastFilterCount) ||\r
+ (MCastFilter == NULL)) {\r
\r
Status = EFI_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
}\r
\r
- if (EnableFlags == 0 && DisableFlags == 0 && !ResetMCastList && MCastAddressCount == 0) {\r
+ if (Enable == 0 && Disable == 0 && !ResetMCastFilter && MCastFilterCnt == 0) {\r
Status = EFI_SUCCESS;\r
goto ON_EXIT;\r
}\r
\r
- if ((EnableFlags & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0 && MCastAddressCount == 0) {\r
+ if ((Enable & EFI_SIMPLE_NETWORK_RECEIVE_MULTICAST) != 0 && MCastFilterCnt == 0) {\r
Status = EFI_INVALID_PARAMETER;\r
goto ON_EXIT;\r
}\r
\r
- if ((EnableFlags != 0) || (MCastAddressCount != 0)) {\r
- Status = pxe_rcvfilter_enable (\r
- snp,\r
- EnableFlags,\r
- MCastAddressCount,\r
- MCastAddressList\r
- );\r
+ if ((Enable != 0) || (MCastFilterCnt != 0)) {\r
+ Status = PxeRecvFilterEnable (\r
+ Snp,\r
+ Enable,\r
+ MCastFilterCnt,\r
+ MCastFilter\r
+ );\r
\r
if (EFI_ERROR (Status)) {\r
goto ON_EXIT;\r
}\r
}\r
\r
- if ((DisableFlags != 0) || ResetMCastList) {\r
- Status = pxe_rcvfilter_disable (snp, DisableFlags, ResetMCastList);\r
+ if ((Disable != 0) || ResetMCastFilter) {\r
+ Status = PxeRecvFilterDisable (Snp, Disable, ResetMCastFilter);\r
\r
if (EFI_ERROR (Status)) {\r
goto ON_EXIT;\r
}\r
}\r
\r
- Status = pxe_rcvfilter_read (snp);\r
+ Status = PxeRecvFilterRead (Snp);\r
\r
ON_EXIT:\r
gBS->RestoreTPL (OldTpl);\r