]> git.proxmox.com Git - mirror_edk2.git/blame - StdLib/EfiSocketLib/UseEfiSocketLib.c
Fix GCC build breaks.
[mirror_edk2.git] / StdLib / EfiSocketLib / UseEfiSocketLib.c
CommitLineData
d7ce7006 1/** @file\r
2 Implement the connection to the EFI socket library\r
3\r
4 Copyright (c) 2011, Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
eb222aea 15#include "Socket.h"\r
d7ce7006 16\r
17\r
18CONST EFI_GUID mEslRawServiceGuid = {\r
19 0xc31bf4a5, 0x2c7, 0x49d2, { 0xa5, 0x58, 0xfe, 0x62, 0x6f, 0x7e, 0xd4, 0x77 }\r
20};\r
21\r
22CONST EFI_GUID mEslTcp4ServiceGuid = {\r
23 0xffc659c2, 0x4ef2, 0x4532, { 0xb8, 0x75, 0xcd, 0x9a, 0xa4, 0x27, 0x4c, 0xde }\r
24};\r
25\r
26CONST EFI_GUID mEslUdp4ServiceGuid = {\r
27 0x44e03a55, 0x8d97, 0x4511, { 0xbf, 0xef, 0xa, 0x8b, 0xc6, 0x2c, 0x25, 0xae }\r
28};\r
29\r
30\r
31/**\r
32 Connect to the EFI socket library\r
33\r
34 @param [in] ppSocketProtocol Address to receive the socket protocol address\r
35\r
36 @retval 0 Successfully returned the socket protocol\r
37 @retval other Value for errno\r
38 **/\r
39int\r
40EslServiceGetProtocol (\r
41 IN EFI_SOCKET_PROTOCOL ** ppSocketProtocol\r
42 )\r
43{\r
44 EFI_HANDLE ChildHandle;\r
45 DT_SOCKET * pSocket;\r
46 int RetVal;\r
47 EFI_STATUS Status;\r
48\r
49 DBG_ENTER ( );\r
50\r
51 //\r
52 // Assume success\r
53 //\r
54 RetVal = 0;\r
55\r
56 //\r
57 // Locate the socket protocol\r
58 //\r
59 ChildHandle = NULL;\r
60 Status = EslSocketAllocate ( &ChildHandle,\r
61 DEBUG_SOCKET,\r
62 &pSocket );\r
63 if ( !EFI_ERROR ( Status )) {\r
64 *ppSocketProtocol = &pSocket->SocketProtocol;\r
65 }\r
66 else {\r
67 //\r
68 // No resources\r
69 //\r
70 RetVal = ENOMEM;\r
71 }\r
72\r
73 //\r
74 // Return the operation status\r
75 //\r
76 DBG_EXIT_DEC ( RetVal );\r
77 return RetVal;\r
78}\r
79\r
80\r
81/**\r
82 Connect to the network layer\r
83\r
84 @retval EFI_SUCCESS Successfully connected to the network layer\r
85\r
86 **/\r
87EFI_STATUS\r
88EslServiceNetworkConnect (\r
89 VOID\r
90 )\r
91{\r
92 UINTN HandleCount;\r
93 EFI_HANDLE * pHandles;\r
94 UINTN Index;\r
95 CONST DT_SOCKET_BINDING * pSocketBinding;\r
96 CONST DT_SOCKET_BINDING * pEnd;\r
97 EFI_STATUS Status;\r
98\r
99 DBG_ENTER ( );\r
100\r
101 //\r
102 // Initialize the socket layer\r
103 //\r
104 Status = EFI_SUCCESS;\r
105 EslServiceLoad ( gImageHandle );\r
106\r
107 //\r
108 // Connect the network devices\r
109 //\r
110 pSocketBinding = &cEslSocketBinding [0];\r
111 pEnd = &pSocketBinding [ cEslSocketBindingEntries ];\r
112 while ( pEnd > pSocketBinding ) {\r
113 //\r
114 // Attempt to locate the network adapters\r
115 //\r
116 HandleCount = 0;\r
117 pHandles = NULL;\r
118 Status = gBS->LocateHandleBuffer ( ByProtocol,\r
119 pSocketBinding->pNetworkBinding,\r
120 NULL,\r
121 &HandleCount,\r
122 &pHandles );\r
123 if ( EFI_ERROR ( Status )) {\r
124 break;\r
125 }\r
126 if ( NULL != pHandles ) {\r
127 //\r
128 // Attempt to connect to this network adapter\r
129 //\r
130 for ( Index = 0; HandleCount > Index; Index++ ) {\r
131 Status = EslServiceConnect ( gImageHandle,\r
132 pHandles [ Index ]);\r
133 if ( EFI_ERROR ( Status )) {\r
134 break;\r
135 }\r
136 }\r
137\r
138 //\r
139 // Done with the handles\r
140 //\r
141 gBS->FreePool ( pHandles );\r
142 }\r
143\r
144 //\r
145 // Set the next network protocol\r
146 //\r
147 pSocketBinding += 1;\r
148 }\r
149\r
150 //\r
151 // Return the network connection status\r
152 //\r
153 DBG_EXIT_STATUS ( Status );\r
154 return Status;\r
155}\r
156\r
157\r
158/**\r
159 Disconnect from the network layer\r
160\r
161 @retval EFI_SUCCESS Successfully disconnected from the network layer\r
162\r
163 **/\r
164EFI_STATUS\r
165EslServiceNetworkDisconnect (\r
166 VOID\r
167 )\r
168{\r
169 UINTN HandleCount;\r
170 EFI_HANDLE * pHandles;\r
171 UINTN Index;\r
172 CONST DT_SOCKET_BINDING * pSocketBinding;\r
173 CONST DT_SOCKET_BINDING * pEnd;\r
174 EFI_STATUS Status;\r
175\r
176 DBG_ENTER ( );\r
177\r
178 //\r
179 // Assume success\r
180 //\r
181 Status = EFI_SUCCESS;\r
182\r
183 //\r
184 // Disconnect the network devices\r
185 //\r
186 pSocketBinding = &cEslSocketBinding [0];\r
187 pEnd = &pSocketBinding [ cEslSocketBindingEntries ];\r
188 while ( pEnd > pSocketBinding ) {\r
189 //\r
190 // Attempt to locate the network adapters\r
191 //\r
192 HandleCount = 0;\r
193 pHandles = NULL;\r
194 Status = gBS->LocateHandleBuffer ( ByProtocol,\r
195 pSocketBinding->pNetworkBinding,\r
196 NULL,\r
197 &HandleCount,\r
198 &pHandles );\r
199 if ( EFI_ERROR ( Status )) {\r
200 break;\r
201 }\r
202 if ( NULL != pHandles ) {\r
203 //\r
204 // Attempt to disconnect from this network adapter\r
205 //\r
206 for ( Index = 0; HandleCount > Index; Index++ ) {\r
207 Status = EslServiceDisconnect ( gImageHandle,\r
208 pHandles [ Index ]);\r
209 if ( EFI_ERROR ( Status )) {\r
210 break;\r
211 }\r
212 }\r
213\r
214 //\r
215 // Done with the handles\r
216 //\r
217 gBS->FreePool ( pHandles );\r
218 }\r
219\r
220 //\r
221 // Set the next network protocol\r
222 //\r
223 pSocketBinding += 1;\r
224 }\r
225\r
226 //\r
227 // Finish the disconnect operation\r
228 //\r
229 if ( !EFI_ERROR ( Status )) {\r
230 EslServiceUnload ( );\r
231 }\r
232\r
233 //\r
234 // Return the network connection status\r
235 //\r
236 DBG_EXIT_STATUS ( Status );\r
237 return Status;\r
238}\r
239\r
240\r
241PFN_ESL_xSTRUCTOR mpfnEslConstructor = EslServiceNetworkConnect;\r
242PFN_ESL_xSTRUCTOR mpfnEslDestructor = EslServiceNetworkDisconnect;\r