1 /** @file
2 UEFI Component Name(2) protocol implementation for Tcp4Dxe driver.
3
4 Copyright (c) 2005 - 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php<BR>
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "Tcp4Main.h"
16
17 /**
18 Retrieves a Unicode string that is the user readable name of the driver.
19
20 This function retrieves the user readable name of a driver in the form of a
21 Unicode string. If the driver specified by This has a user readable name in
22 the language specified by Language, then a pointer to the driver name is
23 returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
24 by This does not support the language specified by Language,
25 then EFI_UNSUPPORTED is returned.
26
27 @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
28 EFI_COMPONENT_NAME_PROTOCOL instance.
29
30 @param[in] Language A pointer to a Null-terminated ASCII string
31 array indicating the language. This is the
32 language of the driver name that the caller is
33 requesting, and it must match one of the
34 languages specified in SupportedLanguages. The
35 number of languages supported by a driver is up
36 to the driver writer. Language is specified
37 in RFC 4646 or ISO 639-2 language code format.
38
39 @param[out] DriverName A pointer to the Unicode string to return.
40 This Unicode string is the name of the
41 driver specified by This in the language
42 specified by Language.
43
44 @retval EFI_SUCCESS The Unicode string for the Driver specified by
45 This and the language specified by Language was
46 returned in DriverName.
47
48 @retval EFI_INVALID_PARAMETER Language is NULL.
49
50 @retval EFI_INVALID_PARAMETER DriverName is NULL.
51
52 @retval EFI_UNSUPPORTED The driver specified by This does not support
53 the language specified by Language.
54
55 **/
56 EFI_STATUS
57 EFIAPI
58 TcpComponentNameGetDriverName (
59 IN EFI_COMPONENT_NAME_PROTOCOL *This,
60 IN CHAR8 *Language,
61 OUT CHAR16 **DriverName
62 );
63
64
65 /**
66 Retrieves a Unicode string that is the user readable name of the controller
67 that is being managed by a driver.
68
69 This function retrieves the user readable name of the controller specified by
70 ControllerHandle and ChildHandle in the form of a Unicode string. If the
71 driver specified by This has a user readable name in the language specified by
72 Language, then a pointer to the controller name is returned in ControllerName,
73 and EFI_SUCCESS is returned. If the driver specified by This is not currently
74 managing the controller specified by ControllerHandle and ChildHandle,
75 then EFI_UNSUPPORTED is returned. If the driver specified by This does not
76 support the language specified by Language, then EFI_UNSUPPORTED is returned.
77
78 @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
79 EFI_COMPONENT_NAME_PROTOCOL instance.
80
81 @param[in] ControllerHandle The handle of a controller that the driver
82 specified by This is managing. This handle
83 specifies the controller whose name is to be
84 returned.
85
86 @param[in] ChildHandle The handle of the child controller to retrieve
87 the name of. This is an optional parameter that
88 may be NULL. It will be NULL for device
89 drivers. It will also be NULL for a bus drivers
90 that wish to retrieve the name of the bus
91 controller. It will not be NULL for a bus
92 driver that wishes to retrieve the name of a
93 child controller.
94
95 @param[in] Language A pointer to a Null-terminated ASCII string
96 array indicating the language. This is the
97 language of the driver name that the caller is
98 requesting, and it must match one of the
99 languages specified in SupportedLanguages. The
100 number of languages supported by a driver is up
101 to the driver writer. Language is specified in
102 RFC 4646 or ISO 639-2 language code format.
103
104 @param[out] ControllerName A pointer to the Unicode string to return.
105 This Unicode string is the name of the
106 controller specified by ControllerHandle and
107 ChildHandle in the language specified by
108 Language from the point of view of the driver
109 specified by This.
110
111 @retval EFI_SUCCESS The Unicode string for the user readable name in
112 the language specified by Language for the
113 driver specified by This was returned in
114 DriverName.
115
116 @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
117
118 @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
119 EFI_HANDLE.
120
121 @retval EFI_INVALID_PARAMETER Language is NULL.
122
123 @retval EFI_INVALID_PARAMETER ControllerName is NULL.
124
125 @retval EFI_UNSUPPORTED The driver specified by This is not currently
126 managing the controller specified by
127 ControllerHandle and ChildHandle.
128
129 @retval EFI_UNSUPPORTED The driver specified by This does not support
130 the language specified by Language.
131
132 **/
133 EFI_STATUS
134 EFIAPI
135 TcpComponentNameGetControllerName (
136 IN EFI_COMPONENT_NAME_PROTOCOL *This,
137 IN EFI_HANDLE ControllerHandle,
138 IN EFI_HANDLE ChildHandle OPTIONAL,
139 IN CHAR8 *Language,
140 OUT CHAR16 **ControllerName
141 );
142
143
144 ///
145 /// EFI Component Name Protocol
146 ///
147 GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gTcp4ComponentName = {
148 TcpComponentNameGetDriverName,
149 TcpComponentNameGetControllerName,
150 "eng"
151 };
152
153 ///
154 /// EFI Component Name 2 Protocol
155 ///
156 GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gTcp4ComponentName2 = {
157 (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) TcpComponentNameGetDriverName,
158 (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) TcpComponentNameGetControllerName,
159 "en"
160 };
161
162
163 GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mTcpDriverNameTable[] = {
164 {
165 "eng;en",
166 L"Tcp Network Service Driver"
167 },
168 {
169 NULL,
170 NULL
171 }
172 };
173
174 GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gTcpControllerNameTable = NULL;
175
176 /**
177 Retrieves a Unicode string that is the user readable name of the driver.
178
179 This function retrieves the user readable name of a driver in the form of a
180 Unicode string. If the driver specified by This has a user readable name in
181 the language specified by Language, then a pointer to the driver name is
182 returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
183 by This does not support the language specified by Language,
184 then EFI_UNSUPPORTED is returned.
185
186 @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
187 EFI_COMPONENT_NAME_PROTOCOL instance.
188
189 @param[in] Language A pointer to a Null-terminated ASCII string
190 array indicating the language. This is the
191 language of the driver name that the caller is
192 requesting, and it must match one of the
193 languages specified in SupportedLanguages. The
194 number of languages supported by a driver is up
195 to the driver writer. Language is specified
196 in RFC 4646 or ISO 639-2 language code format.
197
198 @param[out] DriverName A pointer to the Unicode string to return.
199 This Unicode string is the name of the
200 driver specified by This in the language
201 specified by Language.
202
203 @retval EFI_SUCCESS The Unicode string for the Driver specified by
204 This and the language specified by Language was
205 returned in DriverName.
206
207 @retval EFI_INVALID_PARAMETER Language is NULL.
208
209 @retval EFI_INVALID_PARAMETER DriverName is NULL.
210
211 @retval EFI_UNSUPPORTED The driver specified by This does not support
212 the language specified by Language.
213
214 **/
215 EFI_STATUS
216 EFIAPI
TcpComponentNameGetDriverName(IN EFI_COMPONENT_NAME_PROTOCOL * This,IN CHAR8 * Language,OUT CHAR16 ** DriverName)217 TcpComponentNameGetDriverName (
218 IN EFI_COMPONENT_NAME_PROTOCOL *This,
219 IN CHAR8 *Language,
220 OUT CHAR16 **DriverName
221 )
222 {
223 return LookupUnicodeString2 (
224 Language,
225 This->SupportedLanguages,
226 mTcpDriverNameTable,
227 DriverName,
228 (BOOLEAN) (This == &gTcp4ComponentName)
229 );
230 }
231
232 /**
233 Update the component name for the Tcp4 child handle.
234
235 @param Tcp4[in] A pointer to the EFI_TCP4_PROTOCOL.
236
237
238 @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully.
239 @retval EFI_INVALID_PARAMETER The input parameter is invalid.
240
241 **/
242 EFI_STATUS
UpdateName(IN EFI_TCP4_PROTOCOL * Tcp4)243 UpdateName (
244 IN EFI_TCP4_PROTOCOL *Tcp4
245 )
246 {
247 EFI_STATUS Status;
248 CHAR16 HandleName[80];
249 EFI_TCP4_CONFIG_DATA Tcp4ConfigData;
250
251 if (Tcp4 == NULL) {
252 return EFI_INVALID_PARAMETER;
253 }
254
255 //
256 // Format the child name into the string buffer as:
257 // TCPv4 (SrcPort=59, DestPort=60, ActiveFlag=TRUE)
258 //
259 ZeroMem (&Tcp4ConfigData, sizeof (Tcp4ConfigData));
260 Status = Tcp4->GetModeData (Tcp4, NULL, &Tcp4ConfigData, NULL, NULL, NULL);
261 if (!EFI_ERROR (Status)) {
262 UnicodeSPrint (HandleName, sizeof (HandleName),
263 L"TCPv4 (SrcPort=%d, DestPort=%d, ActiveFlag=%s)",
264 Tcp4ConfigData.AccessPoint.StationPort,
265 Tcp4ConfigData.AccessPoint.RemotePort,
266 (Tcp4ConfigData.AccessPoint.ActiveFlag ? L"TRUE" : L"FALSE")
267 );
268 } else if (Status == EFI_NOT_STARTED) {
269 UnicodeSPrint (
270 HandleName,
271 sizeof (HandleName),
272 L"TCPv4 (Not started)"
273 );
274 } else {
275 return Status;
276 }
277
278 if (gTcpControllerNameTable != NULL) {
279 FreeUnicodeStringTable (gTcpControllerNameTable);
280 gTcpControllerNameTable = NULL;
281 }
282
283 Status = AddUnicodeString2 (
284 "eng",
285 gTcp4ComponentName.SupportedLanguages,
286 &gTcpControllerNameTable,
287 HandleName,
288 TRUE
289 );
290 if (EFI_ERROR (Status)) {
291 return Status;
292 }
293
294 return AddUnicodeString2 (
295 "en",
296 gTcp4ComponentName2.SupportedLanguages,
297 &gTcpControllerNameTable,
298 HandleName,
299 FALSE
300 );
301 }
302
303 /**
304 Retrieves a Unicode string that is the user readable name of the controller
305 that is being managed by a driver.
306
307 This function retrieves the user readable name of the controller specified by
308 ControllerHandle and ChildHandle in the form of a Unicode string. If the
309 driver specified by This has a user readable name in the language specified by
310 Language, then a pointer to the controller name is returned in ControllerName,
311 and EFI_SUCCESS is returned. If the driver specified by This is not currently
312 managing the controller specified by ControllerHandle and ChildHandle,
313 then EFI_UNSUPPORTED is returned. If the driver specified by This does not
314 support the language specified by Language, then EFI_UNSUPPORTED is returned.
315
316 @param[in] This A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
317 EFI_COMPONENT_NAME_PROTOCOL instance.
318
319 @param[in] ControllerHandle The handle of a controller that the driver
320 specified by This is managing. This handle
321 specifies the controller whose name is to be
322 returned.
323
324 @param[in] ChildHandle The handle of the child controller to retrieve
325 the name of. This is an optional parameter that
326 may be NULL. It will be NULL for device
327 drivers. It will also be NULL for a bus drivers
328 that wish to retrieve the name of the bus
329 controller. It will not be NULL for a bus
330 driver that wishes to retrieve the name of a
331 child controller.
332
333 @param[in] Language A pointer to a Null-terminated ASCII string
334 array indicating the language. This is the
335 language of the driver name that the caller is
336 requesting, and it must match one of the
337 languages specified in SupportedLanguages. The
338 number of languages supported by a driver is up
339 to the driver writer. Language is specified in
340 RFC 4646 or ISO 639-2 language code format.
341
342 @param[out] ControllerName A pointer to the Unicode string to return.
343 This Unicode string is the name of the
344 controller specified by ControllerHandle and
345 ChildHandle in the language specified by
346 Language from the point of view of the driver
347 specified by This.
348
349 @retval EFI_SUCCESS The Unicode string for the user readable name in
350 the language specified by Language for the
351 driver specified by This was returned in
352 DriverName.
353
354 @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
355
356 @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
357 EFI_HANDLE.
358
359 @retval EFI_INVALID_PARAMETER Language is NULL.
360
361 @retval EFI_INVALID_PARAMETER ControllerName is NULL.
362
363 @retval EFI_UNSUPPORTED The driver specified by This is not currently
364 managing the controller specified by
365 ControllerHandle and ChildHandle.
366
367 @retval EFI_UNSUPPORTED The driver specified by This does not support
368 the language specified by Language.
369
370 **/
371 EFI_STATUS
372 EFIAPI
TcpComponentNameGetControllerName(IN EFI_COMPONENT_NAME_PROTOCOL * This,IN EFI_HANDLE ControllerHandle,IN EFI_HANDLE ChildHandle OPTIONAL,IN CHAR8 * Language,OUT CHAR16 ** ControllerName)373 TcpComponentNameGetControllerName (
374 IN EFI_COMPONENT_NAME_PROTOCOL *This,
375 IN EFI_HANDLE ControllerHandle,
376 IN EFI_HANDLE ChildHandle OPTIONAL,
377 IN CHAR8 *Language,
378 OUT CHAR16 **ControllerName
379 )
380 {
381 EFI_STATUS Status;
382 EFI_TCP4_PROTOCOL *Tcp4;
383
384 //
385 // Only provide names for child handles.
386 //
387 if (ChildHandle == NULL) {
388 return EFI_UNSUPPORTED;
389 }
390
391 //
392 // Make sure this driver produced ChildHandle
393 //
394 Status = EfiTestChildHandle (
395 ControllerHandle,
396 ChildHandle,
397 &gEfiIp4ProtocolGuid
398 );
399 if (EFI_ERROR (Status)) {
400 return Status;
401 }
402
403 //
404 // Retrieve an instance of a produced protocol from ChildHandle
405 //
406 Status = gBS->OpenProtocol (
407 ChildHandle,
408 &gEfiTcp4ProtocolGuid,
409 (VOID **)&Tcp4,
410 NULL,
411 NULL,
412 EFI_OPEN_PROTOCOL_GET_PROTOCOL
413 );
414 if (EFI_ERROR (Status)) {
415 return Status;
416 }
417
418 //
419 // Update the component name for this child handle.
420 //
421 Status = UpdateName (Tcp4);
422 if (EFI_ERROR (Status)) {
423 return Status;
424 }
425
426 return LookupUnicodeString2 (
427 Language,
428 This->SupportedLanguages,
429 gTcpControllerNameTable,
430 ControllerName,
431 (BOOLEAN)(This == &gTcp4ComponentName)
432 );
433 }
434