]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/SnpDxe/Mcast_ip_to_mac.c
sync comments, fix function header, rename variable name to follow coding style.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / SnpDxe / Mcast_ip_to_mac.c
CommitLineData
f9a088de 1/** @file\r
4cda7726 2 Implementation of converting an multicast IP address to multicast HW MAC\r
3 address.\r
4 \r
5Copyright (c) 2004 - 2007, Intel Corporation. <BR> \r
6All rights reserved. This program and the accompanying materials are licensed \r
7and made available under the terms and conditions of the BSD License which \r
8accompanies this distribution. The full text of the license may be found at \r
9http://opensource.org/licenses/bsd-license.php \r
f9a088de 10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
f9a088de 14**/\r
15\r
16#include "Snp.h"\r
17\r
18/**\r
4cda7726 19 this routine calls undi to convert an multicast IP address to a MAC address.\r
f9a088de 20\r
4cda7726 21 @param Snp pointer to snp driver structure\r
f9a088de 22 @param IPv6 flag to indicate if this is an ipv6 address\r
23 @param IP multicast IP address\r
24 @param MAC pointer to hold the return MAC address\r
25\r
26\r
27**/\r
f9a088de 28EFI_STATUS\r
4cda7726 29PxeIp2Mac (\r
30 IN SNP_DRIVER *Snp,\r
f9a088de 31 IN BOOLEAN IPv6,\r
32 IN EFI_IP_ADDRESS *IP,\r
33 IN OUT EFI_MAC_ADDRESS *MAC\r
34 )\r
35{\r
4cda7726 36 PXE_CPB_MCAST_IP_TO_MAC *Cpb;\r
37 PXE_DB_MCAST_IP_TO_MAC *Db;\r
f9a088de 38\r
4cda7726 39 Cpb = Snp->Cpb;\r
40 Db = Snp->Db;\r
41 Snp->Cdb.OpCode = PXE_OPCODE_MCAST_IP_TO_MAC;\r
42 Snp->Cdb.OpFlags = (UINT16) (IPv6 ? PXE_OPFLAGS_MCAST_IPV6_TO_MAC : PXE_OPFLAGS_MCAST_IPV4_TO_MAC);\r
43 Snp->Cdb.CPBsize = sizeof (PXE_CPB_MCAST_IP_TO_MAC);\r
44 Snp->Cdb.DBsize = sizeof (PXE_DB_MCAST_IP_TO_MAC);\r
f9a088de 45\r
4cda7726 46 Snp->Cdb.CPBaddr = (UINT64)(UINTN) Cpb;\r
47 Snp->Cdb.DBaddr = (UINT64)(UINTN) Db;\r
f9a088de 48\r
4cda7726 49 Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
50 Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
51 Snp->Cdb.IFnum = Snp->IfNum;\r
52 Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
f9a088de 53\r
4cda7726 54 CopyMem (&Cpb->IP, IP, sizeof (PXE_IP_ADDR));\r
f9a088de 55\r
56 //\r
57 // Issue UNDI command and check result.\r
58 //\r
4cda7726 59 DEBUG ((EFI_D_NET, "\nSnp->undi.mcast_ip_to_mac() "));\r
f9a088de 60\r
4cda7726 61 (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb);\r
f9a088de 62\r
4cda7726 63 switch (Snp->Cdb.StatCode) {\r
f9a088de 64 case PXE_STATCODE_SUCCESS:\r
65 break;\r
66\r
67 case PXE_STATCODE_INVALID_CPB:\r
68 return EFI_INVALID_PARAMETER;\r
69\r
70 case PXE_STATCODE_UNSUPPORTED:\r
71 DEBUG (\r
72 (EFI_D_NET,\r
4cda7726 73 "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n",\r
74 Snp->Cdb.StatFlags,\r
75 Snp->Cdb.StatCode)\r
f9a088de 76 );\r
77 return EFI_UNSUPPORTED;\r
78\r
79 default:\r
80 //\r
81 // UNDI command failed. Return EFI_DEVICE_ERROR\r
82 // to caller.\r
83 //\r
84 DEBUG (\r
85 (EFI_D_NET,\r
4cda7726 86 "\nSnp->undi.mcast_ip_to_mac() %xh:%xh\n",\r
87 Snp->Cdb.StatFlags,\r
88 Snp->Cdb.StatCode)\r
f9a088de 89 );\r
90\r
91 return EFI_DEVICE_ERROR;\r
92 }\r
93\r
4cda7726 94 CopyMem (MAC, &Db->MAC, sizeof (PXE_MAC_ADDR));\r
f9a088de 95 return EFI_SUCCESS;\r
96}\r
97\r
98\r
99/**\r
4cda7726 100 Converts a multicast IP address to a multicast HW MAC address.\r
101 \r
102 This function converts a multicast IP address to a multicast HW MAC address \r
103 for all packet transactions. If the mapping is accepted, then EFI_SUCCESS will\r
104 be returned.\r
105\r
106 @param This A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL instance.\r
107 @param IPv6 Set to TRUE if the multicast IP address is IPv6 [RFC 2460].\r
108 Set to FALSE if the multicast IP address is IPv4 [RFC 791]. \r
109 @param IP The multicast IP address that is to be converted to a multicast \r
110 HW MAC address.\r
111 @param MAC The multicast HW MAC address that is to be generated from IP.\r
112\r
113 @retval EFI_SUCCESS The multicast IP address was mapped to the\r
114 multicast HW MAC address.\r
115 @retval EFI_NOT_STARTED The Simple Network Protocol interface has not \r
116 been started by calling Start().\r
117 @retval EFI_INVALID_PARAMETER IP is NULL.\r
118 @retval EFI_INVALID_PARAMETER MAC is NULL.\r
119 @retval EFI_INVALID_PARAMETER IP does not point to a valid IPv4 or IPv6 \r
120 multicast address.\r
121 @retval EFI_DEVICE_ERROR The Simple Network Protocol interface has not \r
122 been initialized by calling Initialize().\r
123 @retval EFI_UNSUPPORTED IPv6 is TRUE and the implementation does not \r
124 support IPv6 multicast to MAC address conversion.\r
f9a088de 125\r
126**/\r
127EFI_STATUS\r
128EFIAPI\r
4cda7726 129SnpUndi32McastIpToMac (\r
130 IN EFI_SIMPLE_NETWORK_PROTOCOL *This,\r
f9a088de 131 IN BOOLEAN IPv6,\r
132 IN EFI_IP_ADDRESS *IP,\r
133 OUT EFI_MAC_ADDRESS *MAC\r
134 )\r
135{\r
4cda7726 136 SNP_DRIVER *Snp;\r
f9a088de 137 EFI_TPL OldTpl;\r
138 EFI_STATUS Status;\r
139\r
140 //\r
141 // Get pointer to SNP driver instance for *this.\r
142 //\r
4cda7726 143 if (This == NULL) {\r
f9a088de 144 return EFI_INVALID_PARAMETER;\r
145 }\r
146\r
147 if (IP == NULL || MAC == NULL) {\r
148 return EFI_INVALID_PARAMETER;\r
149 }\r
150\r
4cda7726 151 Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This);\r
f9a088de 152\r
153 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
154\r
4cda7726 155 switch (Snp->Mode.State) {\r
f9a088de 156 case EfiSimpleNetworkInitialized:\r
157 break;\r
158\r
159 case EfiSimpleNetworkStopped:\r
160 Status = EFI_NOT_STARTED;\r
161 goto ON_EXIT;\r
162\r
163 default:\r
164 Status = EFI_DEVICE_ERROR;\r
165 goto ON_EXIT;\r
166 }\r
167\r
4cda7726 168 Status = PxeIp2Mac (Snp, IPv6, IP, MAC);\r
f9a088de 169\r
170ON_EXIT:\r
171 gBS->RestoreTPL (OldTpl);\r
172\r
173 return Status;\r
174}\r