+++ /dev/null
-/** @file\r
- Implementation of converting an multicast IP address to multicast HW MAC\r
- address.\r
-\r
-Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include "Snp.h"\r
-\r
-/**\r
- Call undi to convert an multicast IP address to a MAC address.\r
-\r
- @param Snp Pointer to snp driver structure.\r
- @param IPv6 Flag to indicate if this is an ipv6 address.\r
- @param IP Multicast IP address.\r
- @param MAC Pointer to hold the return MAC address.\r
-\r
- @retval EFI_SUCCESS The multicast IP address was mapped to the\r
- multicast HW MAC address.\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
-PxeIp2Mac (\r
- IN SNP_DRIVER *Snp,\r
- IN BOOLEAN IPv6,\r
- IN EFI_IP_ADDRESS *IP,\r
- IN OUT EFI_MAC_ADDRESS *MAC\r
- )\r
-{\r
- PXE_CPB_MCAST_IP_TO_MAC *Cpb;\r
- PXE_DB_MCAST_IP_TO_MAC *Db;\r
-\r
- Cpb = Snp->Cpb;\r
- Db = Snp->Db;\r
- Snp->Cdb.OpCode = PXE_OPCODE_MCAST_IP_TO_MAC;\r
- Snp->Cdb.OpFlags = (UINT16) (IPv6 ? PXE_OPFLAGS_MCAST_IPV6_TO_MAC : PXE_OPFLAGS_MCAST_IPV4_TO_MAC);\r
- Snp->Cdb.CPBsize = (UINT16) sizeof (PXE_CPB_MCAST_IP_TO_MAC);\r
- Snp->Cdb.DBsize = (UINT16) sizeof (PXE_DB_MCAST_IP_TO_MAC);\r
-\r
- Snp->Cdb.CPBaddr = (UINT64)(UINTN) Cpb;\r
- Snp->Cdb.DBaddr = (UINT64)(UINTN) Db;\r
-\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
- CopyMem (&Cpb->IP, IP, sizeof (PXE_IP_ADDR));\r
-\r
- //\r
- // Issue UNDI command and check result.\r
- //\r
- DEBUG ((EFI_D_NET, "\nSnp->undi.mcast_ip_to_mac() "));\r
-\r
- (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);\r
-\r
- switch (Snp->Cdb.StatCode) {\r
- case PXE_STATCODE_SUCCESS:\r
- break;\r
-\r
- case PXE_STATCODE_INVALID_CPB:\r
- return EFI_INVALID_PARAMETER;\r
-\r
- case PXE_STATCODE_UNSUPPORTED:\r
- DEBUG (\r
- (EFI_D_NET,\r
- "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n",\r
- Snp->Cdb.StatFlags,\r
- Snp->Cdb.StatCode)\r
- );\r
- return EFI_UNSUPPORTED;\r
-\r
- default:\r
- //\r
- // UNDI command failed. Return EFI_DEVICE_ERROR\r
- // to caller.\r
- //\r
- DEBUG (\r
- (EFI_D_NET,\r
- "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n",\r
- Snp->Cdb.StatFlags,\r
- Snp->Cdb.StatCode)\r
- );\r
-\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- CopyMem (MAC, &Db->MAC, sizeof (PXE_MAC_ADDR));\r
- return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
- Converts a multicast IP address to a multicast HW MAC address.\r
-\r
- This function converts a multicast IP address to a multicast HW MAC address\r
- for all packet transactions. If the mapping is accepted, then EFI_SUCCESS will\r
- be returned.\r
-\r
- @param This A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL instance.\r
- @param IPv6 Set to TRUE if the multicast IP address is IPv6 [RFC 2460].\r
- Set to FALSE if the multicast IP address is IPv4 [RFC 791].\r
- @param IP The multicast IP address that is to be converted to a multicast\r
- HW MAC address.\r
- @param MAC The multicast HW MAC address that is to be generated from IP.\r
-\r
- @retval EFI_SUCCESS The multicast IP address was mapped to the\r
- multicast HW MAC address.\r
- @retval EFI_NOT_STARTED The Simple Network Protocol interface has not\r
- been started by calling Start().\r
- @retval EFI_INVALID_PARAMETER IP is NULL.\r
- @retval EFI_INVALID_PARAMETER MAC is NULL.\r
- @retval EFI_INVALID_PARAMETER IP does not point to a valid IPv4 or IPv6\r
- multicast address.\r
- @retval EFI_DEVICE_ERROR The Simple Network Protocol interface has not\r
- been initialized by calling Initialize().\r
- @retval EFI_UNSUPPORTED IPv6 is TRUE and the implementation does not\r
- support IPv6 multicast to MAC address conversion.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-SnpUndi32McastIpToMac (\r
- IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
- IN BOOLEAN IPv6,\r
- IN EFI_IP_ADDRESS *IP,\r
- OUT EFI_MAC_ADDRESS *MAC\r
- )\r
-{\r
- SNP_DRIVER *Snp;\r
- EFI_TPL OldTpl;\r
- EFI_STATUS Status;\r
-\r
- //\r
- // Get pointer to SNP driver instance for *this.\r
- //\r
- if (This == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (IP == NULL || MAC == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This);\r
-\r
- OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
- switch (Snp->Mode.State) {\r
- case EfiSimpleNetworkInitialized:\r
- break;\r
-\r
- case EfiSimpleNetworkStopped:\r
- Status = EFI_NOT_STARTED;\r
- goto ON_EXIT;\r
-\r
- default:\r
- Status = EFI_DEVICE_ERROR;\r
- goto ON_EXIT;\r
- }\r
-\r
- Status = PxeIp2Mac (Snp, IPv6, IP, MAC);\r
-\r
-ON_EXIT:\r
- gBS->RestoreTPL (OldTpl);\r
-\r
- return Status;\r
-}\r