]> git.proxmox.com Git - mirror_edk2.git/blame - EdkModulePkg/Universal/Network/Snp32_64/Dxe/mcast_ip_to_mac.c
Partially make EdkModulePkg pass intel IPF compiler with /W4 /WX switched on.
[mirror_edk2.git] / EdkModulePkg / Universal / Network / Snp32_64 / Dxe / mcast_ip_to_mac.c
CommitLineData
878ddf1f 1/*++\r
2Copyright (c) 2006, Intel Corporation \r
3All rights reserved. This program and the accompanying materials \r
4are licensed and made available under the terms and conditions of the BSD License \r
5which accompanies this distribution. The full text of the license may be found at \r
6http://opensource.org/licenses/bsd-license.php \r
7 \r
8THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
9WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
10\r
11Module name:\r
12 mcast_ip_to_mac.c\r
13\r
14Abstract:\r
15\r
16Revision history:\r
17 2000-Feb-17 M(f)J Genesis.\r
18--*/\r
19\r
20\r
4cbd855e 21#include "Snp.h"\r
878ddf1f 22\r
1cc8ee78 23STATIC\r
878ddf1f 24EFI_STATUS\r
25pxe_ip2mac (\r
26 IN SNP_DRIVER *snp,\r
27 IN BOOLEAN IPv6,\r
28 IN EFI_IP_ADDRESS *IP,\r
29 IN OUT EFI_MAC_ADDRESS *MAC\r
30 )\r
31/*++\r
32\r
33Routine Description:\r
34 this routine calls undi to convert an multicast IP address to a MAC address\r
35\r
36Arguments:\r
37 snp - pointer to snp driver structure\r
38 IPv6 - flag to indicate if this is an ipv6 address\r
39 IP - multicast IP address\r
40 MAC - pointer to hold the return MAC address\r
41\r
42Returns:\r
43\r
44--*/\r
45{\r
46 PXE_CPB_MCAST_IP_TO_MAC *cpb;\r
47 PXE_DB_MCAST_IP_TO_MAC *db;\r
48\r
49 cpb = snp->cpb;\r
50 db = snp->db;\r
51 snp->cdb.OpCode = PXE_OPCODE_MCAST_IP_TO_MAC;\r
52 snp->cdb.OpFlags = (UINT16) (IPv6 ? PXE_OPFLAGS_MCAST_IPV6_TO_MAC : PXE_OPFLAGS_MCAST_IPV4_TO_MAC);\r
53 snp->cdb.CPBsize = sizeof (PXE_CPB_MCAST_IP_TO_MAC);\r
54 snp->cdb.DBsize = sizeof (PXE_DB_MCAST_IP_TO_MAC);\r
55\r
56 snp->cdb.CPBaddr = (UINT64) (UINTN) cpb;\r
57 snp->cdb.DBaddr = (UINT64) (UINTN) db;\r
58\r
59 snp->cdb.StatCode = PXE_STATCODE_INITIALIZE;\r
60 snp->cdb.StatFlags = PXE_STATFLAGS_INITIALIZE;\r
61 snp->cdb.IFnum = snp->if_num;\r
62 snp->cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST;\r
63\r
64 CopyMem (&cpb->IP, IP, sizeof (PXE_IP_ADDR));\r
65\r
66 //\r
67 // Issue UNDI command and check result.\r
68 //\r
69 DEBUG ((EFI_D_NET, "\nsnp->undi.mcast_ip_to_mac() "));\r
70\r
71 (*snp->issue_undi32_command) ((UINT64) (UINTN) &snp->cdb);\r
72\r
73 switch (snp->cdb.StatCode) {\r
74 case PXE_STATCODE_SUCCESS:\r
75 break;\r
76\r
77 case PXE_STATCODE_INVALID_CPB:\r
78 return EFI_INVALID_PARAMETER;\r
79\r
80 case PXE_STATCODE_UNSUPPORTED:\r
81 DEBUG (\r
82 (EFI_D_NET,\r
83 "\nsnp->undi.mcast_ip_to_mac() %xh:%xh\n",\r
84 snp->cdb.StatFlags,\r
85 snp->cdb.StatCode)\r
86 );\r
87 return EFI_UNSUPPORTED;\r
88\r
89 default:\r
90 //\r
91 // UNDI command failed. Return EFI_DEVICE_ERROR\r
92 // to caller.\r
93 //\r
94 DEBUG (\r
95 (EFI_D_NET,\r
96 "\nsnp->undi.mcast_ip_to_mac() %xh:%xh\n",\r
97 snp->cdb.StatFlags,\r
98 snp->cdb.StatCode)\r
99 );\r
100\r
101 return EFI_DEVICE_ERROR;\r
102 }\r
103\r
104 CopyMem (MAC, &db->MAC, sizeof (PXE_MAC_ADDR));\r
105 return EFI_SUCCESS;\r
106}\r
107\r
108EFI_STATUS\r
109EFIAPI\r
110snp_undi32_mcast_ip_to_mac (\r
111 IN EFI_SIMPLE_NETWORK_PROTOCOL *this,\r
112 IN BOOLEAN IPv6,\r
113 IN EFI_IP_ADDRESS *IP,\r
114 OUT EFI_MAC_ADDRESS *MAC\r
115 )\r
116/*++\r
117\r
118Routine Description:\r
119 This is the SNP interface routine for converting a multicast IP address to\r
120 a MAC address.\r
121 This routine basically retrieves snp structure, checks the SNP state and\r
122 calls the pxe_ip2mac routine to actually do the conversion\r
123\r
124Arguments:\r
125 this - context pointer\r
126 IPv6 - flag to indicate if this is an ipv6 address\r
127 IP - multicast IP address\r
128 MAC - pointer to hold the return MAC address\r
129\r
130Returns:\r
131\r
132--*/\r
133{\r
134 SNP_DRIVER *snp;\r
135\r
136 //\r
137 // Get pointer to SNP driver instance for *this.\r
138 //\r
139 if (this == NULL) {\r
140 return EFI_INVALID_PARAMETER;\r
141 }\r
142\r
143 snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (this);\r
144\r
145 if (snp == NULL) {\r
146 return EFI_DEVICE_ERROR;\r
147 }\r
148\r
149 switch (snp->mode.State) {\r
150 case EfiSimpleNetworkInitialized:\r
151 break;\r
152\r
153 case EfiSimpleNetworkStopped:\r
154 return EFI_NOT_STARTED;\r
155\r
156 case EfiSimpleNetworkStarted:\r
157 return EFI_DEVICE_ERROR;\r
158\r
159 default:\r
160 return EFI_DEVICE_ERROR;\r
161 }\r
162\r
163 if (IP == NULL || MAC == NULL) {\r
164 return EFI_INVALID_PARAMETER;\r
165 }\r
166\r
167 return pxe_ip2mac (snp, IPv6, IP, MAC);\r
168}\r