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