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