Implementation of EFI_COMPONENT_NAME_PROTOCOL and\r
EFI_COMPONENT_NAME2_PROTOCOL protocol.\r
\r
- Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
}\r
};\r
\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gIp6ControllerNameTable = NULL;\r
+\r
/**\r
Retrieves a Unicode string that is the user-readable name of the driver.\r
\r
\r
}\r
\r
+/**\r
+ Update the component name for the IP6 child handle.\r
+\r
+ @param Ip6[in] A pointer to the EFI_IP6_PROTOCOL.\r
+\r
+ \r
+ @retval EFI_SUCCESS Update the ControllerNameTable of this instance successfully.\r
+ @retval EFI_INVALID_PARAMETER The input parameter is invalid.\r
+ \r
+**/\r
+EFI_STATUS\r
+UpdateName (\r
+ IN EFI_IP6_PROTOCOL *Ip6\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ CHAR16 HandleName[128];\r
+ EFI_IP6_MODE_DATA Ip6ModeData;\r
+ UINTN Offset;\r
+ CHAR16 Address[sizeof"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];\r
+\r
+ if (Ip6 == NULL) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Format the child name into the string buffer.\r
+ //\r
+ Offset = 0;\r
+ Status = Ip6->GetModeData (Ip6, &Ip6ModeData, NULL, NULL);\r
+ if (!EFI_ERROR (Status)) {\r
+ if (Ip6ModeData.AddressList != NULL) {\r
+ FreePool (Ip6ModeData.AddressList);\r
+ }\r
+\r
+ if (Ip6ModeData.GroupTable != NULL) {\r
+ FreePool (Ip6ModeData.GroupTable);\r
+ }\r
+\r
+ if (Ip6ModeData.RouteTable != NULL) {\r
+ FreePool (Ip6ModeData.RouteTable);\r
+ }\r
+\r
+ if (Ip6ModeData.NeighborCache != NULL) {\r
+ FreePool (Ip6ModeData.NeighborCache);\r
+ }\r
+\r
+ if (Ip6ModeData.PrefixTable != NULL) {\r
+ FreePool (Ip6ModeData.PrefixTable);\r
+ }\r
+\r
+ if (Ip6ModeData.IcmpTypeList != NULL) {\r
+ FreePool (Ip6ModeData.IcmpTypeList);\r
+ }\r
+ }\r
+\r
+ if (!EFI_ERROR (Status) && Ip6ModeData.IsStarted) {\r
+ Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.StationAddress, Address, sizeof(Address));\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ Offset += UnicodeSPrint (\r
+ HandleName,\r
+ sizeof(HandleName),\r
+ L"IPv6(StationAddress=%s, ",\r
+ Address\r
+ );\r
+ Status = NetLibIp6ToStr (&Ip6ModeData.ConfigData.DestinationAddress, Address, sizeof(Address));\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ UnicodeSPrint (\r
+ HandleName + Offset,\r
+ sizeof(HandleName) - Offset * sizeof (CHAR16),\r
+ L"DestinationAddress=%s)",\r
+ Address\r
+ );\r
+ } else if (!Ip6ModeData.IsStarted) {\r
+ UnicodeSPrint (HandleName, sizeof(HandleName), L"IPv6(Not started)");\r
+ } else {\r
+ UnicodeSPrint (HandleName, sizeof(HandleName), L"IPv6(%r)", Status);\r
+ }\r
+\r
+ if (gIp6ControllerNameTable != NULL) {\r
+ FreeUnicodeStringTable (gIp6ControllerNameTable);\r
+ gIp6ControllerNameTable = NULL;\r
+ }\r
+ \r
+ Status = AddUnicodeString2 (\r
+ "eng",\r
+ gIp6ComponentName.SupportedLanguages,\r
+ &gIp6ControllerNameTable,\r
+ HandleName,\r
+ TRUE\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+ \r
+ return AddUnicodeString2 (\r
+ "en",\r
+ gIp6ComponentName2.SupportedLanguages,\r
+ &gIp6ControllerNameTable,\r
+ HandleName,\r
+ FALSE\r
+ );\r
+}\r
+\r
/**\r
Retrieves a Unicode string that is the user-readable name of the controller\r
that is being managed by a driver.\r
OUT CHAR16 **ControllerName\r
)\r
{\r
- return EFI_UNSUPPORTED;\r
+ EFI_STATUS Status;\r
+ EFI_IP6_PROTOCOL *Ip6;\r
+ \r
+ //\r
+ // Only provide names for child handles.\r
+ //\r
+ if (ChildHandle == NULL) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ //\r
+ // Make sure this driver produced ChildHandle \r
+ //\r
+ Status = EfiTestChildHandle (\r
+ ControllerHandle,\r
+ ChildHandle,\r
+ &gEfiManagedNetworkProtocolGuid\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Retrieve an instance of a produced protocol from ChildHandle\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ ChildHandle,\r
+ &gEfiIp6ProtocolGuid,\r
+ (VOID **)&Ip6,\r
+ NULL,\r
+ NULL,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Update the component name for this child handle.\r
+ //\r
+ Status = UpdateName (Ip6);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ return LookupUnicodeString2 (\r
+ Language,\r
+ This->SupportedLanguages,\r
+ gIp6ControllerNameTable,\r
+ ControllerName,\r
+ (BOOLEAN)(This == &gIp6ComponentName)\r
+ );\r
}\r