]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DevicePathDxe/DevicePathFromText.c
Adopt new IPv4/IPv6 device path for network modules.
[mirror_edk2.git] / MdeModulePkg / Universal / DevicePathDxe / DevicePathFromText.c
index 0c1f6a61a7f87726982f1d0a4733c19dee0566e7..11f5c159df449acb1482c1f9e3dbeb2e08b19cc5 100644 (file)
@@ -1,8 +1,8 @@
 /** @file\r
   DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
 \r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
 http://opensource.org/licenses/bsd-license.php\r
@@ -708,7 +708,7 @@ DevPathFromTextPci (
   Pci         = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
                                       HARDWARE_DEVICE_PATH,\r
                                       HW_PCI_DP,\r
-                                      sizeof (PCI_DEVICE_PATH)\r
+                                      (UINT16) sizeof (PCI_DEVICE_PATH)\r
                                       );\r
 \r
   Pci->Function = (UINT8) Strtoi (FunctionStr);\r
@@ -737,7 +737,7 @@ DevPathFromTextPcCard (
   Pccard            = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
                                                HARDWARE_DEVICE_PATH,\r
                                                HW_PCCARD_DP,\r
-                                               sizeof (PCCARD_DEVICE_PATH)\r
+                                               (UINT16) sizeof (PCCARD_DEVICE_PATH)\r
                                                );\r
 \r
   Pccard->FunctionNumber  = (UINT8) Strtoi (FunctionNumberStr);\r
@@ -769,7 +769,7 @@ DevPathFromTextMemoryMapped (
   MemMap             = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
                                                HARDWARE_DEVICE_PATH,\r
                                                HW_MEMMAP_DP,\r
-                                               sizeof (MEMMAP_DEVICE_PATH)\r
+                                               (UINT16) sizeof (MEMMAP_DEVICE_PATH)\r
                                                );\r
 \r
   MemMap->MemoryType = (UINT32) Strtoi (MemoryTypeStr);\r
@@ -863,7 +863,7 @@ DevPathFromTextCtrl (
   Controller    = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
                                                HARDWARE_DEVICE_PATH,\r
                                                HW_CONTROLLER_DP,\r
-                                               sizeof (CONTROLLER_DEVICE_PATH)\r
+                                               (UINT16) sizeof (CONTROLLER_DEVICE_PATH)\r
                                                );\r
   Controller->ControllerNumber = (UINT32) Strtoi (ControllerStr);\r
 \r
@@ -914,7 +914,7 @@ DevPathFromTextAcpi (
   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
                                       ACPI_DEVICE_PATH,\r
                                       ACPI_DP,\r
-                                      sizeof (ACPI_HID_DEVICE_PATH)\r
+                                      (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
                                       );\r
 \r
   EisaIdFromText (HIDStr, &Acpi->HID);\r
@@ -945,7 +945,7 @@ ConvertFromTextAcpi (
   Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
                                       ACPI_DEVICE_PATH,\r
                                       ACPI_DP,\r
-                                      sizeof (ACPI_HID_DEVICE_PATH)\r
+                                      (UINT16) sizeof (ACPI_HID_DEVICE_PATH)\r
                                       );\r
 \r
   Acpi->HID = EFI_PNP_ID (PnPId);\r
@@ -970,6 +970,22 @@ DevPathFromTextPciRoot (
   return ConvertFromTextAcpi (TextDeviceNode, 0x0a03);\r
 }\r
 \r
+/**\r
+  Converts a text device path node to PCIE root device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created PCIE root device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPcieRoot (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextAcpi (TextDeviceNode, 0x0a08);\r
+}\r
+\r
 /**\r
   Converts a text device path node to Floppy device path structure.\r
 \r
@@ -1137,6 +1153,53 @@ DevPathFromTextAcpiExp (
   return (EFI_DEVICE_PATH_PROTOCOL *) AcpiEx;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to ACPI _ADR device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created ACPI _ADR device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpiAdr (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *DisplayDeviceStr;\r
+  ACPI_ADR_DEVICE_PATH  *AcpiAdr;\r
+  UINTN                 Index;\r
+  UINTN                 Length;\r
+\r
+  AcpiAdr = (ACPI_ADR_DEVICE_PATH *) CreateDeviceNode (\r
+                                       ACPI_DEVICE_PATH,\r
+                                       ACPI_ADR_DP,\r
+                                       (UINT16) sizeof (ACPI_ADR_DEVICE_PATH)\r
+                                       );\r
+  ASSERT (AcpiAdr != NULL);\r
+\r
+  for (Index = 0; ; Index++) {\r
+    DisplayDeviceStr = GetNextParamStr (&TextDeviceNode);\r
+    if (IS_NULL (*DisplayDeviceStr)) {\r
+      break;\r
+    }\r
+    if (Index > 0) {\r
+      Length  = DevicePathNodeLength (AcpiAdr);\r
+      AcpiAdr = ReallocatePool (\r
+                  Length,\r
+                  Length + sizeof (UINT32),\r
+                  AcpiAdr\r
+                  );\r
+      ASSERT (AcpiAdr != NULL);\r
+      SetDevicePathNodeLength (AcpiAdr, Length + sizeof (UINT32));\r
+    }\r
+    \r
+    (&AcpiAdr->ADR)[Index] = (UINT32) Strtoi (DisplayDeviceStr);\r
+  }\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) AcpiAdr;\r
+}\r
+\r
 /**\r
   Converts a text device path node to Parallel Port device path structure.\r
 \r
@@ -1158,7 +1221,7 @@ DevPathFromTextAta (
   Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
                                   MESSAGING_DEVICE_PATH,\r
                                   MSG_ATAPI_DP,\r
-                                  sizeof (ATAPI_DEVICE_PATH)\r
+                                  (UINT16) sizeof (ATAPI_DEVICE_PATH)\r
                                   );\r
 \r
   PrimarySecondaryStr     = GetNextParamStr (&TextDeviceNode);\r
@@ -1194,7 +1257,7 @@ DevPathFromTextScsi (
   Scsi   = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
                                    MESSAGING_DEVICE_PATH,\r
                                    MSG_SCSI_DP,\r
-                                   sizeof (SCSI_DEVICE_PATH)\r
+                                   (UINT16) sizeof (SCSI_DEVICE_PATH)\r
                                    );\r
 \r
   Scsi->Pun = (UINT16) Strtoi (PunStr);\r
@@ -1225,7 +1288,7 @@ DevPathFromTextFibre (
   Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
                                           MESSAGING_DEVICE_PATH,\r
                                           MSG_FIBRECHANNEL_DP,\r
-                                          sizeof (FIBRECHANNEL_DEVICE_PATH)\r
+                                          (UINT16) sizeof (FIBRECHANNEL_DEVICE_PATH)\r
                                           );\r
 \r
   Fibre->Reserved = 0;\r
@@ -1235,6 +1298,41 @@ DevPathFromTextFibre (
   return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to FibreEx device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created FibreEx device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFibreEx (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                      *WWNStr;\r
+  CHAR16                      *LunStr;\r
+  FIBRECHANNELEX_DEVICE_PATH  *FibreEx;\r
+\r
+  WWNStr  = GetNextParamStr (&TextDeviceNode);\r
+  LunStr  = GetNextParamStr (&TextDeviceNode);\r
+  FibreEx = (FIBRECHANNELEX_DEVICE_PATH *) CreateDeviceNode (\r
+                                             MESSAGING_DEVICE_PATH,\r
+                                             MSG_FIBRECHANNELEX_DP,\r
+                                             (UINT16) sizeof (FIBRECHANNELEX_DEVICE_PATH)\r
+                                             );\r
+\r
+  FibreEx->Reserved = 0;\r
+  Strtoi64 (WWNStr, (UINT64 *) (&FibreEx->WWN));\r
+  Strtoi64 (LunStr, (UINT64 *) (&FibreEx->Lun));\r
+\r
+  *(UINT64 *) (&FibreEx->WWN) = SwapBytes64 (*(UINT64 *) (&FibreEx->WWN));\r
+  *(UINT64 *) (&FibreEx->Lun) = SwapBytes64 (*(UINT64 *) (&FibreEx->Lun));\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) FibreEx;\r
+}\r
+\r
 /**\r
   Converts a text device path node to 1394 device path structure.\r
 \r
@@ -1255,7 +1353,7 @@ DevPathFromText1394 (
   F1394DevPath  = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
                                           MESSAGING_DEVICE_PATH,\r
                                           MSG_1394_DP,\r
-                                          sizeof (F1394_DEVICE_PATH)\r
+                                          (UINT16) sizeof (F1394_DEVICE_PATH)\r
                                           );\r
 \r
   F1394DevPath->Reserved = 0;\r
@@ -1286,7 +1384,7 @@ DevPathFromTextUsb (
   Usb                   = (USB_DEVICE_PATH *) CreateDeviceNode (\r
                                                 MESSAGING_DEVICE_PATH,\r
                                                 MSG_USB_DP,\r
-                                                sizeof (USB_DEVICE_PATH)\r
+                                                (UINT16) sizeof (USB_DEVICE_PATH)\r
                                                 );\r
 \r
   Usb->ParentPortNumber = (UINT8) Strtoi (PortStr);\r
@@ -1315,7 +1413,7 @@ DevPathFromTextI2O (
   I2ODevPath = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_I2O_DP,\r
-                                    sizeof (I2O_DEVICE_PATH)\r
+                                    (UINT16) sizeof (I2O_DEVICE_PATH)\r
                                     );\r
 \r
   I2ODevPath->Tid  = (UINT32) Strtoi (TIDStr);\r
@@ -1352,7 +1450,7 @@ DevPathFromTextInfiniband (
   InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
                                             MESSAGING_DEVICE_PATH,\r
                                             MSG_INFINIBAND_DP,\r
-                                            sizeof (INFINIBAND_DEVICE_PATH)\r
+                                            (UINT16) sizeof (INFINIBAND_DEVICE_PATH)\r
                                             );\r
 \r
   InfiniBand->ResourceFlags = (UINT32) Strtoi (FlagsStr);\r
@@ -1403,7 +1501,7 @@ DevPathFromTextVenPcAnsi (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
@@ -1427,7 +1525,7 @@ DevPathFromTextVenVt100 (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
@@ -1451,7 +1549,7 @@ DevPathFromTextVenVt100Plus (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
@@ -1475,7 +1573,7 @@ DevPathFromTextVenUtf8 (
   Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
                                     MESSAGING_DEVICE_PATH,\r
                                     MSG_VENDOR_DP,\r
-                                    sizeof (VENDOR_DEVICE_PATH));\r
+                                    (UINT16) sizeof (VENDOR_DEVICE_PATH));\r
   CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
@@ -1501,7 +1599,7 @@ DevPathFromTextUartFlowCtrl (
   UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
                                                         MESSAGING_DEVICE_PATH,\r
                                                         MSG_VENDOR_DP,\r
-                                                        sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
+                                                        (UINT16) sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
                                                         );\r
 \r
   CopyGuid (&UartFlowControl->Guid, &gEfiUartDevicePathGuid);\r
@@ -1552,7 +1650,7 @@ DevPathFromTextSAS (
   Sas         = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
                                        MESSAGING_DEVICE_PATH,\r
                                        MSG_VENDOR_DP,\r
-                                       sizeof (SAS_DEVICE_PATH)\r
+                                       (UINT16) sizeof (SAS_DEVICE_PATH)\r
                                        );\r
 \r
   CopyGuid (&Sas->Guid, &gEfiSasDevicePathGuid);\r
@@ -1586,6 +1684,74 @@ DevPathFromTextSAS (
   return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to Serial Attached SCSI Ex device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created Serial Attached SCSI Ex device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSasEx (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *AddressStr;\r
+  CHAR16            *LunStr;\r
+  CHAR16            *RTPStr;\r
+  CHAR16            *SASSATAStr;\r
+  CHAR16            *LocationStr;\r
+  CHAR16            *ConnectStr;\r
+  CHAR16            *DriveBayStr;\r
+  UINT16            Info;\r
+  SASEX_DEVICE_PATH *SasEx;\r
+\r
+  AddressStr  = GetNextParamStr (&TextDeviceNode);\r
+  LunStr      = GetNextParamStr (&TextDeviceNode);\r
+  RTPStr      = GetNextParamStr (&TextDeviceNode);\r
+  SASSATAStr  = GetNextParamStr (&TextDeviceNode);\r
+  LocationStr = GetNextParamStr (&TextDeviceNode);\r
+  ConnectStr  = GetNextParamStr (&TextDeviceNode);\r
+  DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
+  Info        = 0x0000;\r
+  SasEx       = (SASEX_DEVICE_PATH *) CreateDeviceNode (\r
+                                        MESSAGING_DEVICE_PATH,\r
+                                        MSG_SASEX_DP,\r
+                                        (UINT16) sizeof (SASEX_DEVICE_PATH)\r
+                                        );\r
+\r
+  Strtoi64 (AddressStr, (UINT64 *) &SasEx->SasAddress);\r
+  Strtoi64 (LunStr,     (UINT64 *) &SasEx->Lun);\r
+  *(UINT64 *) &SasEx->SasAddress = SwapBytes64 (*(UINT64 *) &SasEx->SasAddress);\r
+  *(UINT64 *) &SasEx->Lun        = SwapBytes64 (*(UINT64 *) &SasEx->Lun);\r
+  SasEx->RelativeTargetPort      = (UINT16) Strtoi (RTPStr);\r
+  if (StrCmp (SASSATAStr, L"NoTopology") != 0) {\r
+    if (StrCmp (DriveBayStr, L"0") == 0) {\r
+      Info |= 0x0001;\r
+    } else {\r
+      Info |= 0x0002;\r
+      Info = (UINT16) (Info | (Strtoi (DriveBayStr) << 8));\r
+    }\r
+\r
+    if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
+      Info |= 0x0010;\r
+    }\r
+\r
+    if (StrCmp (LocationStr, L"External") == 0) {\r
+      Info |= 0x0020;\r
+    }\r
+\r
+    if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
+      Info |= 0x0040;\r
+    }\r
+  }\r
+\r
+  SasEx->DeviceTopology = Info;\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) SasEx;\r
+}\r
+\r
 /**\r
   Converts a text device path node to Debug Port device path structure.\r
 \r
@@ -1604,7 +1770,7 @@ DevPathFromTextDebugPort (
   Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
                                                     MESSAGING_DEVICE_PATH,\r
                                                     MSG_VENDOR_DP,\r
-                                                    sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
+                                                    (UINT16) sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
                                                     );\r
 \r
   CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
@@ -1635,7 +1801,7 @@ DevPathFromTextMAC (
   MACDevPath    = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
                                               MESSAGING_DEVICE_PATH,\r
                                               MSG_MAC_ADDR_DP,\r
-                                              sizeof (MAC_ADDR_DEVICE_PATH)\r
+                                              (UINT16) sizeof (MAC_ADDR_DEVICE_PATH)\r
                                               );\r
 \r
   MACDevPath->IfType   = (UINT8) Strtoi (IfTypeStr);\r
@@ -1646,6 +1812,32 @@ DevPathFromTextMAC (
   return (EFI_DEVICE_PATH_PROTOCOL *) MACDevPath;\r
 }\r
 \r
+\r
+/**\r
+  Converts a text format to the network protocol ID.\r
+\r
+  @param Text  String of protocol field.\r
+\r
+  @return Network protocol ID .\r
+\r
+**/\r
+UINTN\r
+NetworkProtocolFromText (\r
+  IN CHAR16 *Text\r
+  )\r
+{\r
+  if (StrCmp (Text, L"UDP") == 0) {\r
+    return RFC_1700_UDP_PROTOCOL;\r
+  }\r
+\r
+  if (StrCmp (Text, L"TCP") == 0) {\r
+    return RFC_1700_TCP_PROTOCOL;\r
+  }\r
+\r
+  return Strtoi (Text);\r
+}\r
+\r
+\r
 /**\r
   Converts a text device path node to IPV4 device path structure.\r
 \r
@@ -1663,20 +1855,24 @@ DevPathFromTextIPv4 (
   CHAR16            *ProtocolStr;\r
   CHAR16            *TypeStr;\r
   CHAR16            *LocalIPStr;\r
+  CHAR16            *GatewayIPStr;\r
+  CHAR16            *SubnetMaskStr;\r
   IPv4_DEVICE_PATH  *IPv4;\r
 \r
   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);\r
   ProtocolStr           = GetNextParamStr (&TextDeviceNode);\r
   TypeStr               = GetNextParamStr (&TextDeviceNode);\r
   LocalIPStr            = GetNextParamStr (&TextDeviceNode);\r
+  GatewayIPStr          = GetNextParamStr (&TextDeviceNode);\r
+  SubnetMaskStr         = GetNextParamStr (&TextDeviceNode);\r
   IPv4                  = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
                                                  MESSAGING_DEVICE_PATH,\r
                                                  MSG_IPv4_DP,\r
-                                                 sizeof (IPv4_DEVICE_PATH)\r
+                                                 (UINT16) sizeof (IPv4_DEVICE_PATH)\r
                                                  );\r
 \r
   StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
-  IPv4->Protocol = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);\r
+  IPv4->Protocol = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
   if (StrCmp (TypeStr, L"Static") == 0) {\r
     IPv4->StaticIpAddress = TRUE;\r
   } else {\r
@@ -1684,6 +1880,13 @@ DevPathFromTextIPv4 (
   }\r
 \r
   StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
+  if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*SubnetMaskStr)) {\r
+    StrToIPv4Addr (&GatewayIPStr,  &IPv4->GatewayIpAddress);\r
+    StrToIPv4Addr (&SubnetMaskStr, &IPv4->SubnetMask);\r
+  } else {\r
+    ZeroMem (&IPv4->GatewayIpAddress, sizeof (IPv4->GatewayIpAddress));\r
+    ZeroMem (&IPv4->SubnetMask,    sizeof (IPv4->SubnetMask));\r
+  }\r
 \r
   IPv4->LocalPort       = 0;\r
   IPv4->RemotePort      = 0;\r
@@ -1708,27 +1911,40 @@ DevPathFromTextIPv6 (
   CHAR16            *ProtocolStr;\r
   CHAR16            *TypeStr;\r
   CHAR16            *LocalIPStr;\r
+  CHAR16            *GatewayIPStr;\r
+  CHAR16            *PrefixLengthStr;\r
   IPv6_DEVICE_PATH  *IPv6;\r
 \r
   RemoteIPStr           = GetNextParamStr (&TextDeviceNode);\r
   ProtocolStr           = GetNextParamStr (&TextDeviceNode);\r
   TypeStr               = GetNextParamStr (&TextDeviceNode);\r
   LocalIPStr            = GetNextParamStr (&TextDeviceNode);\r
+  PrefixLengthStr       = GetNextParamStr (&TextDeviceNode);\r
+  GatewayIPStr          = GetNextParamStr (&TextDeviceNode);\r
   IPv6                  = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
                                                  MESSAGING_DEVICE_PATH,\r
                                                  MSG_IPv6_DP,\r
-                                                 sizeof (IPv6_DEVICE_PATH)\r
+                                                 (UINT16) sizeof (IPv6_DEVICE_PATH)\r
                                                  );\r
 \r
   StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
-  IPv6->Protocol        = (UINT16) ((StrCmp (ProtocolStr, L"UDP") == 0) ? 0 : 1);\r
+  IPv6->Protocol        = (UINT16) NetworkProtocolFromText (ProtocolStr);\r
   if (StrCmp (TypeStr, L"Static") == 0) {\r
-    IPv6->StaticIpAddress = TRUE;\r
+    IPv6->IpAddressOrigin = 0;\r
+  } else if (StrCmp (TypeStr, L"StatelessAutoConfigure") == 0) {\r
+    IPv6->IpAddressOrigin = 1;\r
   } else {\r
-    IPv6->StaticIpAddress = FALSE;\r
+    IPv6->IpAddressOrigin = 2;\r
   }\r
 \r
   StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
+  if (!IS_NULL (*GatewayIPStr) && !IS_NULL (*PrefixLengthStr)) {\r
+    StrToIPv6Addr (&GatewayIPStr, &IPv6->GatewayIpAddress);\r
+    IPv6->PrefixLength = (UINT8) Strtoi (PrefixLengthStr);\r
+  } else {\r
+    ZeroMem (&IPv6->GatewayIpAddress, sizeof (IPv6->GatewayIpAddress));\r
+    IPv6->PrefixLength = 0;\r
+  }\r
 \r
   IPv6->LocalPort       = 0;\r
   IPv6->RemotePort      = 0;\r
@@ -1762,7 +1978,7 @@ DevPathFromTextUart (
   Uart            = (UART_DEVICE_PATH *) CreateDeviceNode (\r
                                            MESSAGING_DEVICE_PATH,\r
                                            MSG_UART_DP,\r
-                                           sizeof (UART_DEVICE_PATH)\r
+                                           (UINT16) sizeof (UART_DEVICE_PATH)\r
                                            );\r
 \r
   Uart->BaudRate  = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Dtoi (BaudStr);\r
@@ -1835,7 +2051,7 @@ ConvertFromTextUsbClass (
   UsbClass    = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
                                             MESSAGING_DEVICE_PATH,\r
                                             MSG_USB_CLASS_DP,\r
-                                            sizeof (USB_CLASS_DEVICE_PATH)\r
+                                            (UINT16) sizeof (USB_CLASS_DEVICE_PATH)\r
                                             );\r
 \r
   VIDStr      = GetNextParamStr (&TextDeviceNode);\r
@@ -2319,7 +2535,7 @@ DevPathFromTextiSCSI (
                                                         (UINT16) (sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + StrLen (NameStr))\r
                                                         );\r
 \r
-  AsciiStr = ISCSIDevPath->iSCSITargetName;\r
+  AsciiStr = ISCSIDevPath->TargetName;\r
   StrToAscii (NameStr, &AsciiStr);\r
 \r
   ISCSIDevPath->TargetPortalGroupTag = (UINT16) Strtoi (PortalGroupStr);\r
@@ -2349,6 +2565,34 @@ DevPathFromTextiSCSI (
   return (EFI_DEVICE_PATH_PROTOCOL *) ISCSIDevPath;\r
 }\r
 \r
+/**\r
+  Converts a text device path node to VLAN device path structure.\r
+\r
+  @param TextDeviceNode  The input Text device path node.\r
+\r
+  @return A pointer to the newly-created VLAN device path structure.\r
+\r
+**/\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVlan (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *VlanStr;\r
+  VLAN_DEVICE_PATH  *Vlan;\r
+\r
+  VlanStr = GetNextParamStr (&TextDeviceNode);\r
+  Vlan    = (VLAN_DEVICE_PATH *) CreateDeviceNode (\r
+                                   MESSAGING_DEVICE_PATH,\r
+                                   MSG_VLAN_DP,\r
+                                   (UINT16) sizeof (VLAN_DEVICE_PATH)\r
+                                   );\r
+\r
+  Vlan->VlanId = (UINT16) Strtoi (VlanStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vlan;\r
+}\r
+\r
 /**\r
   Converts a text device path node to HD device path structure.\r
 \r
@@ -2379,7 +2623,7 @@ DevPathFromTextHD (
   Hd                  = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
                                                     MEDIA_DEVICE_PATH,\r
                                                     MEDIA_HARDDRIVE_DP,\r
-                                                    sizeof (HARDDRIVE_DEVICE_PATH)\r
+                                                    (UINT16) sizeof (HARDDRIVE_DEVICE_PATH)\r
                                                     );\r
 \r
   Hd->PartitionNumber = (UINT32) Dtoi (PartitionStr);\r
@@ -2433,7 +2677,7 @@ DevPathFromTextCDROM (
   CDROMDevPath          = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
                                                   MEDIA_DEVICE_PATH,\r
                                                   MEDIA_CDROM_DP,\r
-                                                  sizeof (CDROM_DEVICE_PATH)\r
+                                                  (UINT16) sizeof (CDROM_DEVICE_PATH)\r
                                                   );\r
 \r
   CDROMDevPath->BootEntry = (UINT32) Strtoi (EntryStr);\r
@@ -2509,7 +2753,7 @@ DevPathFromTextMedia (
   Media   = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
                                              MEDIA_DEVICE_PATH,\r
                                              MEDIA_PROTOCOL_DP,\r
-                                             sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
+                                             (UINT16) sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
                                              );\r
 \r
   StrToGuid (GuidStr, &Media->Protocol);\r
@@ -2537,7 +2781,7 @@ DevPathFromTextFv (
   Fv      = (MEDIA_FW_VOL_DEVICE_PATH *) CreateDeviceNode (\r
                                            MEDIA_DEVICE_PATH,\r
                                            MEDIA_PIWG_FW_VOL_DP,\r
-                                           sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
+                                           (UINT16) sizeof (MEDIA_FW_VOL_DEVICE_PATH)\r
                                            );\r
 \r
   StrToGuid (GuidStr, &Fv->FvName);\r
@@ -2565,7 +2809,7 @@ DevPathFromTextFvFile (
   FvFile  = (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
                                                     MEDIA_DEVICE_PATH,\r
                                                     MEDIA_PIWG_FW_FILE_DP,\r
-                                                    sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
+                                                    (UINT16) sizeof (MEDIA_FW_VOL_FILEPATH_DEVICE_PATH)\r
                                                     );\r
 \r
   StrToGuid (GuidStr, &FvFile->FvFileName);\r
@@ -2589,23 +2833,17 @@ DevPathFromTextRelativeOffsetRange (
   CHAR16                                  *StartingOffsetStr;\r
   CHAR16                                  *EndingOffsetStr;\r
   MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *Offset;\r
-  UINT64                                  StartingOffset;\r
-  UINT64                                  EndingOffset;\r
 \r
   StartingOffsetStr = GetNextParamStr (&TextDeviceNode);\r
   EndingOffsetStr   = GetNextParamStr (&TextDeviceNode);\r
   Offset            = (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH *) CreateDeviceNode (\r
                                                                     MEDIA_DEVICE_PATH,\r
                                                                     MEDIA_RELATIVE_OFFSET_RANGE_DP,\r
-                                                                    sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)\r
+                                                                    (UINT16) sizeof (MEDIA_RELATIVE_OFFSET_RANGE_DEVICE_PATH)\r
                                                                     );\r
 \r
-  Strtoi64 (StartingOffsetStr, &StartingOffset);\r
-  Strtoi64 (EndingOffsetStr, &EndingOffset);\r
-\r
-  WriteUnaligned64 ((VOID *) &Offset->StartingOffset, StartingOffset);\r
-  WriteUnaligned64 ((VOID *) &Offset->EndingOffset, EndingOffset);\r
-\r
+  Strtoi64 (StartingOffsetStr, &Offset->StartingOffset);\r
+  Strtoi64 (EndingOffsetStr, &Offset->EndingOffset);\r
 \r
   return (EFI_DEVICE_PATH_PROTOCOL *) Offset;\r
 }\r
@@ -2693,7 +2931,7 @@ DevPathFromTextSata (
   Sata = (SATA_DEVICE_PATH *) CreateDeviceNode (\r
                                 MESSAGING_DEVICE_PATH,\r
                                 MSG_SATA_DP,\r
-                                sizeof (SATA_DEVICE_PATH)\r
+                                (UINT16) sizeof (SATA_DEVICE_PATH)\r
                                 );\r
   Sata->HBAPortNumber = (UINT16) Xtoi (Param1);\r
   if (Param3 != NULL) {\r
@@ -2715,15 +2953,18 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[]
   {L"Ctrl", DevPathFromTextCtrl},\r
   {L"Acpi", DevPathFromTextAcpi},\r
   {L"PciRoot", DevPathFromTextPciRoot},\r
+  {L"PcieRoot", DevPathFromTextPcieRoot},\r
   {L"Floppy", DevPathFromTextFloppy},\r
   {L"Keyboard", DevPathFromTextKeyboard},\r
   {L"Serial", DevPathFromTextSerial},\r
   {L"ParallelPort", DevPathFromTextParallelPort},\r
   {L"AcpiEx", DevPathFromTextAcpiEx},\r
   {L"AcpiExp", DevPathFromTextAcpiExp},\r
+  {L"AcpiAdr", DevPathFromTextAcpiAdr},\r
   {L"Ata", DevPathFromTextAta},\r
   {L"Scsi", DevPathFromTextScsi},\r
   {L"Fibre", DevPathFromTextFibre},\r
+  {L"FibreEx", DevPathFromTextFibreEx},\r
   {L"I1394", DevPathFromText1394},\r
   {L"USB", DevPathFromTextUsb},\r
   {L"I2O", DevPathFromTextI2O},\r
@@ -2735,6 +2976,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[]
   {L"VenUtf8", DevPathFromTextVenUtf8},\r
   {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
   {L"SAS", DevPathFromTextSAS},\r
+  {L"SasEx", DevPathFromTextSasEx},\r
   {L"DebugPort", DevPathFromTextDebugPort},\r
   {L"MAC", DevPathFromTextMAC},\r
   {L"IPv4", DevPathFromTextIPv4},\r
@@ -2759,6 +3001,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[]
   {L"UsbWwid", DevPathFromTextUsbWwid},\r
   {L"Unit", DevPathFromTextUnit},\r
   {L"iSCSI", DevPathFromTextiSCSI},\r
+  {L"Vlan", DevPathFromTextVlan},\r
   {L"HD", DevPathFromTextHD},\r
   {L"CDROM", DevPathFromTextCDROM},\r
   {L"VenMEDIA", DevPathFromTextVenMEDIA},\r