public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries
@ 2017-07-26  3:41 Jiaxin Wu
  2017-07-26  3:48 ` Fu, Siyuan
  2017-08-03  5:10 ` Jin, Eric
  0 siblings, 2 replies; 4+ messages in thread
From: Jiaxin Wu @ 2017-07-26  3:41 UTC (permalink / raw)
  To: edk2-devel; +Cc: Ye Ting, Fu Siyuan, Wu Jiaxin

V2:
* Add no IP instance case check.

Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com>
---
 .../Library/UefiDevicePathLib/DevicePathFromText.c | 80 ++++++++++++++++++++++
 .../Library/UefiDevicePathLib/DevicePathToText.c   | 46 +++++++++++++
 2 files changed, 126 insertions(+)

diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
index f50c11c..3cdc11f 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
@@ -2723,10 +2723,89 @@ DevPathFromTextBluetoothLE (
     );
   return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothLeDp;
 }
 
 /**
+  Converts a text device path node to DNS device path structure.
+
+  @param TextDeviceNode  The input Text device path node.
+
+  @return A pointer to the newly-created DNS device path structure.
+
+**/
+EFI_DEVICE_PATH_PROTOCOL *
+DevPathFromTextDns (
+  IN CHAR16 *TextDeviceNode
+  )
+{
+  CHAR16            *DeviceNodeStr;
+  UINT32            DnsServerIpCount;
+  UINT16            DnsDeviceNodeLength;
+  DNS_DEVICE_PATH   *DnsDeviceNode;
+  UINT32            DnsServerIpIndex;
+  CHAR16            *DnsServerIp;
+
+
+  //
+  // Count the DNS server address number.
+  //
+  DeviceNodeStr    = TextDeviceNode;
+  DnsServerIpCount = 0;
+  while (DeviceNodeStr != NULL && *DeviceNodeStr != L'\0') {
+    GetNextParamStr (&DeviceNodeStr);
+    DnsServerIpCount ++; 
+  }
+
+  //
+  // One or more instances of the DNS server address in EFI_IP_ADDRESS, 
+  // otherwise, NULL will be returned.
+  //
+  if (DnsServerIpCount == 0) {
+    return NULL;
+  }
+
+  //
+  // Create the DNS DeviceNode.
+  //
+  DnsDeviceNodeLength = (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));
+  DnsDeviceNode       = (DNS_DEVICE_PATH *) CreateDeviceNode (
+                                              MESSAGING_DEVICE_PATH,
+                                              MSG_DNS_DP,
+                                              DnsDeviceNodeLength
+                                              );
+
+  //
+  // Confirm the DNS server address is IPv4 or IPv6 type.
+  //
+  DeviceNodeStr = TextDeviceNode;
+  while (!IS_NULL (*DeviceNodeStr)) {
+    if (*DeviceNodeStr == L'.') {
+      DnsDeviceNode->IsIPv6 = 0x00;
+      break;
+    }
+
+    if (*DeviceNodeStr == L':') {
+      DnsDeviceNode->IsIPv6 = 0x01;
+      break;
+    }
+
+    DeviceNodeStr++;
+  }
+
+  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
+    DnsServerIp = GetNextParamStr (&TextDeviceNode);
+    if (DnsDeviceNode->IsIPv6 == 0x00) {
+      StrToIpv4Address (DnsServerIp,  NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);
+    } else {
+      StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);
+    }
+  }
+  
+  return (EFI_DEVICE_PATH_PROTOCOL *) DnsDeviceNode;
+}
+
+/**
   Converts a text device path node to URI device path structure.
 
   @param TextDeviceNode  The input Text device path node.
 
   @return A pointer to the newly-created URI device path structure.
@@ -3395,10 +3474,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"UsbTestAndMeasurement",   DevPathFromTextUsbTestAndMeasurement   },
   {L"UsbWwid",                 DevPathFromTextUsbWwid                 },
   {L"Unit",                    DevPathFromTextUnit                    },
   {L"iSCSI",                   DevPathFromTextiSCSI                   },
   {L"Vlan",                    DevPathFromTextVlan                    },
+  {L"Dns",                     DevPathFromTextDns                     },
   {L"Uri",                     DevPathFromTextUri                     },
   {L"Bluetooth",               DevPathFromTextBluetooth               },
   {L"Wi-Fi",                   DevPathFromTextWiFi                    },
   {L"BluetoothLE",             DevPathFromTextBluetoothLE             },
   {L"MediaPath",               DevPathFromTextMediaPath               },
diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
index b8d9491..63542db 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
@@ -1695,10 +1695,55 @@ DevPathToTextBluetoothLE (
     BluetoothLE->Address.Type
     );
 }
 
 /**
+  Converts a DNS device path structure to its string representative.
+
+  @param Str             The string representative of input device.
+  @param DevPath         The input device path structure.
+  @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text representation
+                         of the display node is used, where applicable. If DisplayOnly
+                         is FALSE, then the longer text representation of the display node
+                         is used.
+  @param AllowShortcuts  If AllowShortcuts is TRUE, then the shortcut forms of text
+                         representation for a device node can be used, where applicable.
+
+**/
+VOID
+DevPathToTextDns (
+  IN OUT POOL_PRINT  *Str,
+  IN VOID            *DevPath,
+  IN BOOLEAN         DisplayOnly,
+  IN BOOLEAN         AllowShortcuts
+  )
+{
+  DNS_DEVICE_PATH  *DnsDevPath;
+  UINT32           DnsServerIpCount;
+  UINT32           DnsServerIpIndex;
+
+  DnsDevPath     = DevPath;
+  DnsServerIpCount = (UINT32) (DevicePathNodeLength(DnsDevPath) - sizeof (EFI_DEVICE_PATH_PROTOCOL) - sizeof (DnsDevPath->IsIPv6)) / sizeof (EFI_IP_ADDRESS);
+
+  UefiDevicePathLibCatPrint (Str, L"Dns(");
+  
+  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
+    if (DnsDevPath->IsIPv6 == 0x00) {
+      CatIPv4Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v4));
+    } else {
+      CatIPv6Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v6));
+    }
+
+    if (DnsServerIpIndex < DnsServerIpCount - 1) {
+      UefiDevicePathLibCatPrint (Str, L",");
+    }
+  }
+
+  UefiDevicePathLibCatPrint (Str, L")");
+}
+
+/**
   Converts a URI device path structure to its string representative.
 
   @param Str             The string representative of input device.
   @param DevPath         The input device path structure.
   @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text representation
@@ -2223,10 +2268,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLib
   {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP,                DevPathToTextInfiniBand     },
   {MESSAGING_DEVICE_PATH, MSG_UART_DP,                      DevPathToTextUart           },
   {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP,                    DevPathToTextVendor         },
   {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP,                     DevPathToTextiSCSI          },
   {MESSAGING_DEVICE_PATH, MSG_VLAN_DP,                      DevPathToTextVlan           },
+  {MESSAGING_DEVICE_PATH, MSG_DNS_DP,                       DevPathToTextDns            },
   {MESSAGING_DEVICE_PATH, MSG_URI_DP,                       DevPathToTextUri            },
   {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_DP,                 DevPathToTextBluetooth      },
   {MESSAGING_DEVICE_PATH, MSG_WIFI_DP,                      DevPathToTextWiFi           },
   {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_LE_DP,              DevPathToTextBluetoothLE    },
   {MEDIA_DEVICE_PATH,     MEDIA_HARDDRIVE_DP,               DevPathToTextHardDrive      },
-- 
1.9.5.msysgit.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries
  2017-07-26  3:41 [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries Jiaxin Wu
@ 2017-07-26  3:48 ` Fu, Siyuan
  2017-08-03  5:10 ` Jin, Eric
  1 sibling, 0 replies; 4+ messages in thread
From: Fu, Siyuan @ 2017-07-26  3:48 UTC (permalink / raw)
  To: Wu, Jiaxin, edk2-devel@lists.01.org; +Cc: Ye, Ting

Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>


-----Original Message-----
From: Wu, Jiaxin 
Sent: Wednesday, July 26, 2017 11:41 AM
To: edk2-devel@lists.01.org
Cc: Ye, Ting <ting.ye@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
Subject: [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries

V2:
* Add no IP instance case check.

Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com>
---
 .../Library/UefiDevicePathLib/DevicePathFromText.c | 80 ++++++++++++++++++++++
 .../Library/UefiDevicePathLib/DevicePathToText.c   | 46 +++++++++++++
 2 files changed, 126 insertions(+)

diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
index f50c11c..3cdc11f 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
@@ -2723,10 +2723,89 @@ DevPathFromTextBluetoothLE (
     );
   return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothLeDp;
 }
 
 /**
+  Converts a text device path node to DNS device path structure.
+
+  @param TextDeviceNode  The input Text device path node.
+
+  @return A pointer to the newly-created DNS device path structure.
+
+**/
+EFI_DEVICE_PATH_PROTOCOL *
+DevPathFromTextDns (
+  IN CHAR16 *TextDeviceNode
+  )
+{
+  CHAR16            *DeviceNodeStr;
+  UINT32            DnsServerIpCount;
+  UINT16            DnsDeviceNodeLength;
+  DNS_DEVICE_PATH   *DnsDeviceNode;
+  UINT32            DnsServerIpIndex;
+  CHAR16            *DnsServerIp;
+
+
+  //
+  // Count the DNS server address number.
+  //
+  DeviceNodeStr    = TextDeviceNode;
+  DnsServerIpCount = 0;
+  while (DeviceNodeStr != NULL && *DeviceNodeStr != L'\0') {
+    GetNextParamStr (&DeviceNodeStr);
+    DnsServerIpCount ++; 
+  }
+
+  //
+  // One or more instances of the DNS server address in EFI_IP_ADDRESS, 
+  // otherwise, NULL will be returned.
+  //
+  if (DnsServerIpCount == 0) {
+    return NULL;
+  }
+
+  //
+  // Create the DNS DeviceNode.
+  //
+  DnsDeviceNodeLength = (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));
+  DnsDeviceNode       = (DNS_DEVICE_PATH *) CreateDeviceNode (
+                                              MESSAGING_DEVICE_PATH,
+                                              MSG_DNS_DP,
+                                              DnsDeviceNodeLength
+                                              );
+
+  //
+  // Confirm the DNS server address is IPv4 or IPv6 type.
+  //
+  DeviceNodeStr = TextDeviceNode;
+  while (!IS_NULL (*DeviceNodeStr)) {
+    if (*DeviceNodeStr == L'.') {
+      DnsDeviceNode->IsIPv6 = 0x00;
+      break;
+    }
+
+    if (*DeviceNodeStr == L':') {
+      DnsDeviceNode->IsIPv6 = 0x01;
+      break;
+    }
+
+    DeviceNodeStr++;
+  }
+
+  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
+    DnsServerIp = GetNextParamStr (&TextDeviceNode);
+    if (DnsDeviceNode->IsIPv6 == 0x00) {
+      StrToIpv4Address (DnsServerIp,  NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);
+    } else {
+      StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);
+    }
+  }
+  
+  return (EFI_DEVICE_PATH_PROTOCOL *) DnsDeviceNode;
+}
+
+/**
   Converts a text device path node to URI device path structure.
 
   @param TextDeviceNode  The input Text device path node.
 
   @return A pointer to the newly-created URI device path structure.
@@ -3395,10 +3474,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"UsbTestAndMeasurement",   DevPathFromTextUsbTestAndMeasurement   },
   {L"UsbWwid",                 DevPathFromTextUsbWwid                 },
   {L"Unit",                    DevPathFromTextUnit                    },
   {L"iSCSI",                   DevPathFromTextiSCSI                   },
   {L"Vlan",                    DevPathFromTextVlan                    },
+  {L"Dns",                     DevPathFromTextDns                     },
   {L"Uri",                     DevPathFromTextUri                     },
   {L"Bluetooth",               DevPathFromTextBluetooth               },
   {L"Wi-Fi",                   DevPathFromTextWiFi                    },
   {L"BluetoothLE",             DevPathFromTextBluetoothLE             },
   {L"MediaPath",               DevPathFromTextMediaPath               },
diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
index b8d9491..63542db 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
@@ -1695,10 +1695,55 @@ DevPathToTextBluetoothLE (
     BluetoothLE->Address.Type
     );
 }
 
 /**
+  Converts a DNS device path structure to its string representative.
+
+  @param Str             The string representative of input device.
+  @param DevPath         The input device path structure.
+  @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text representation
+                         of the display node is used, where applicable. If DisplayOnly
+                         is FALSE, then the longer text representation of the display node
+                         is used.
+  @param AllowShortcuts  If AllowShortcuts is TRUE, then the shortcut forms of text
+                         representation for a device node can be used, where applicable.
+
+**/
+VOID
+DevPathToTextDns (
+  IN OUT POOL_PRINT  *Str,
+  IN VOID            *DevPath,
+  IN BOOLEAN         DisplayOnly,
+  IN BOOLEAN         AllowShortcuts
+  )
+{
+  DNS_DEVICE_PATH  *DnsDevPath;
+  UINT32           DnsServerIpCount;
+  UINT32           DnsServerIpIndex;
+
+  DnsDevPath     = DevPath;
+  DnsServerIpCount = (UINT32) (DevicePathNodeLength(DnsDevPath) - sizeof (EFI_DEVICE_PATH_PROTOCOL) - sizeof (DnsDevPath->IsIPv6)) / sizeof (EFI_IP_ADDRESS);
+
+  UefiDevicePathLibCatPrint (Str, L"Dns(");
+  
+  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
+    if (DnsDevPath->IsIPv6 == 0x00) {
+      CatIPv4Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v4));
+    } else {
+      CatIPv6Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v6));
+    }
+
+    if (DnsServerIpIndex < DnsServerIpCount - 1) {
+      UefiDevicePathLibCatPrint (Str, L",");
+    }
+  }
+
+  UefiDevicePathLibCatPrint (Str, L")");
+}
+
+/**
   Converts a URI device path structure to its string representative.
 
   @param Str             The string representative of input device.
   @param DevPath         The input device path structure.
   @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text representation
@@ -2223,10 +2268,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLib
   {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP,                DevPathToTextInfiniBand     },
   {MESSAGING_DEVICE_PATH, MSG_UART_DP,                      DevPathToTextUart           },
   {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP,                    DevPathToTextVendor         },
   {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP,                     DevPathToTextiSCSI          },
   {MESSAGING_DEVICE_PATH, MSG_VLAN_DP,                      DevPathToTextVlan           },
+  {MESSAGING_DEVICE_PATH, MSG_DNS_DP,                       DevPathToTextDns            },
   {MESSAGING_DEVICE_PATH, MSG_URI_DP,                       DevPathToTextUri            },
   {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_DP,                 DevPathToTextBluetooth      },
   {MESSAGING_DEVICE_PATH, MSG_WIFI_DP,                      DevPathToTextWiFi           },
   {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_LE_DP,              DevPathToTextBluetoothLE    },
   {MEDIA_DEVICE_PATH,     MEDIA_HARDDRIVE_DP,               DevPathToTextHardDrive      },
-- 
1.9.5.msysgit.1



^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries
  2017-07-26  3:41 [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries Jiaxin Wu
  2017-07-26  3:48 ` Fu, Siyuan
@ 2017-08-03  5:10 ` Jin, Eric
  2017-08-03  5:12   ` Wu, Jiaxin
  1 sibling, 1 reply; 4+ messages in thread
From: Jin, Eric @ 2017-08-03  5:10 UTC (permalink / raw)
  To: Wu, Jiaxin, edk2-devel@lists.01.org
  Cc: Ye, Ting, Fu, Siyuan, Wu, Jiaxin, Jin, Eric

Jiaxin,

In V2, the input parameter, TextDeviceNode, in the DevPathFromTextDns() is parsed by GetNextParamStr() twice.
After the first parse, the content of TextDeviceNode is modified and can convert to correct device path node.

Suggest to duplicate the TextDeviceNode or restore the return value of 1st GetNextParamStr() for usage in next step. Thanks.

Best Regards
Eric

-----Original Message-----
From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Jiaxin Wu
Sent: Wednesday, July 26, 2017 11:41 AM
To: edk2-devel@lists.01.org
Cc: Ye, Ting <ting.ye@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu, Jiaxin <jiaxin.wu@intel.com>
Subject: [edk2] [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries

V2:
* Add no IP instance case check.

Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com>
---
 .../Library/UefiDevicePathLib/DevicePathFromText.c | 80 ++++++++++++++++++++++
 .../Library/UefiDevicePathLib/DevicePathToText.c   | 46 +++++++++++++
 2 files changed, 126 insertions(+)

diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
index f50c11c..3cdc11f 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
@@ -2723,10 +2723,89 @@ DevPathFromTextBluetoothLE (
     );
   return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothLeDp;  }
 
 /**
+  Converts a text device path node to DNS device path structure.
+
+  @param TextDeviceNode  The input Text device path node.
+
+  @return A pointer to the newly-created DNS device path structure.
+
+**/
+EFI_DEVICE_PATH_PROTOCOL *
+DevPathFromTextDns (
+  IN CHAR16 *TextDeviceNode
+  )
+{
+  CHAR16            *DeviceNodeStr;
+  UINT32            DnsServerIpCount;
+  UINT16            DnsDeviceNodeLength;
+  DNS_DEVICE_PATH   *DnsDeviceNode;
+  UINT32            DnsServerIpIndex;
+  CHAR16            *DnsServerIp;
+
+
+  //
+  // Count the DNS server address number.
+  //
+  DeviceNodeStr    = TextDeviceNode;
+  DnsServerIpCount = 0;
+  while (DeviceNodeStr != NULL && *DeviceNodeStr != L'\0') {
+    GetNextParamStr (&DeviceNodeStr);
+    DnsServerIpCount ++;
+  }
+
+  //
+  // One or more instances of the DNS server address in EFI_IP_ADDRESS,  
+ // otherwise, NULL will be returned.
+  //
+  if (DnsServerIpCount == 0) {
+    return NULL;
+  }
+
+  //
+  // Create the DNS DeviceNode.
+  //
+  DnsDeviceNodeLength = (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));
+  DnsDeviceNode       = (DNS_DEVICE_PATH *) CreateDeviceNode (
+                                              MESSAGING_DEVICE_PATH,
+                                              MSG_DNS_DP,
+                                              DnsDeviceNodeLength
+                                              );
+
+  //
+  // Confirm the DNS server address is IPv4 or IPv6 type.
+  //
+  DeviceNodeStr = TextDeviceNode;
+  while (!IS_NULL (*DeviceNodeStr)) {
+    if (*DeviceNodeStr == L'.') {
+      DnsDeviceNode->IsIPv6 = 0x00;
+      break;
+    }
+
+    if (*DeviceNodeStr == L':') {
+      DnsDeviceNode->IsIPv6 = 0x01;
+      break;
+    }
+
+    DeviceNodeStr++;
+  }
+
+  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
+    DnsServerIp = GetNextParamStr (&TextDeviceNode);
+    if (DnsDeviceNode->IsIPv6 == 0x00) {
+      StrToIpv4Address (DnsServerIp,  NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v4), NULL);
+    } else {
+      StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode->DnsServerIp[DnsServerIpIndex].v6), NULL);
+    }
+  }
+  
+  return (EFI_DEVICE_PATH_PROTOCOL *) DnsDeviceNode; }
+
+/**
   Converts a text device path node to URI device path structure.
 
   @param TextDeviceNode  The input Text device path node.
 
   @return A pointer to the newly-created URI device path structure.
@@ -3395,10 +3474,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
   {L"UsbTestAndMeasurement",   DevPathFromTextUsbTestAndMeasurement   },
   {L"UsbWwid",                 DevPathFromTextUsbWwid                 },
   {L"Unit",                    DevPathFromTextUnit                    },
   {L"iSCSI",                   DevPathFromTextiSCSI                   },
   {L"Vlan",                    DevPathFromTextVlan                    },
+  {L"Dns",                     DevPathFromTextDns                     },
   {L"Uri",                     DevPathFromTextUri                     },
   {L"Bluetooth",               DevPathFromTextBluetooth               },
   {L"Wi-Fi",                   DevPathFromTextWiFi                    },
   {L"BluetoothLE",             DevPathFromTextBluetoothLE             },
   {L"MediaPath",               DevPathFromTextMediaPath               },
diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
index b8d9491..63542db 100644
--- a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
+++ b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
@@ -1695,10 +1695,55 @@ DevPathToTextBluetoothLE (
     BluetoothLE->Address.Type
     );
 }
 
 /**
+  Converts a DNS device path structure to its string representative.
+
+  @param Str             The string representative of input device.
+  @param DevPath         The input device path structure.
+  @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text representation
+                         of the display node is used, where applicable. If DisplayOnly
+                         is FALSE, then the longer text representation of the display node
+                         is used.
+  @param AllowShortcuts  If AllowShortcuts is TRUE, then the shortcut forms of text
+                         representation for a device node can be used, where applicable.
+
+**/
+VOID
+DevPathToTextDns (
+  IN OUT POOL_PRINT  *Str,
+  IN VOID            *DevPath,
+  IN BOOLEAN         DisplayOnly,
+  IN BOOLEAN         AllowShortcuts
+  )
+{
+  DNS_DEVICE_PATH  *DnsDevPath;
+  UINT32           DnsServerIpCount;
+  UINT32           DnsServerIpIndex;
+
+  DnsDevPath     = DevPath;
+  DnsServerIpCount = (UINT32) (DevicePathNodeLength(DnsDevPath) - 
+ sizeof (EFI_DEVICE_PATH_PROTOCOL) - sizeof (DnsDevPath->IsIPv6)) / 
+ sizeof (EFI_IP_ADDRESS);
+
+  UefiDevicePathLibCatPrint (Str, L"Dns(");
+  
+  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount; DnsServerIpIndex++) {
+    if (DnsDevPath->IsIPv6 == 0x00) {
+      CatIPv4Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v4));
+    } else {
+      CatIPv6Address (Str, &(DnsDevPath->DnsServerIp[DnsServerIpIndex].v6));
+    }
+
+    if (DnsServerIpIndex < DnsServerIpCount - 1) {
+      UefiDevicePathLibCatPrint (Str, L",");
+    }
+  }
+
+  UefiDevicePathLibCatPrint (Str, L")"); }
+
+/**
   Converts a URI device path structure to its string representative.
 
   @param Str             The string representative of input device.
   @param DevPath         The input device path structure.
   @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text representation
@@ -2223,10 +2268,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED const DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLib
   {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP,                DevPathToTextInfiniBand     },
   {MESSAGING_DEVICE_PATH, MSG_UART_DP,                      DevPathToTextUart           },
   {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP,                    DevPathToTextVendor         },
   {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP,                     DevPathToTextiSCSI          },
   {MESSAGING_DEVICE_PATH, MSG_VLAN_DP,                      DevPathToTextVlan           },
+  {MESSAGING_DEVICE_PATH, MSG_DNS_DP,                       DevPathToTextDns            },
   {MESSAGING_DEVICE_PATH, MSG_URI_DP,                       DevPathToTextUri            },
   {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_DP,                 DevPathToTextBluetooth      },
   {MESSAGING_DEVICE_PATH, MSG_WIFI_DP,                      DevPathToTextWiFi           },
   {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_LE_DP,              DevPathToTextBluetoothLE    },
   {MEDIA_DEVICE_PATH,     MEDIA_HARDDRIVE_DP,               DevPathToTextHardDrive      },
--
1.9.5.msysgit.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries
  2017-08-03  5:10 ` Jin, Eric
@ 2017-08-03  5:12   ` Wu, Jiaxin
  0 siblings, 0 replies; 4+ messages in thread
From: Wu, Jiaxin @ 2017-08-03  5:12 UTC (permalink / raw)
  To: Jin, Eric, edk2-devel@lists.01.org; +Cc: Ye, Ting, Fu, Siyuan

You are right. Thanks Eric, will send out V3 later.



> -----Original Message-----
> From: Jin, Eric
> Sent: Thursday, August 3, 2017 1:10 PM
> To: Wu, Jiaxin <jiaxin.wu@intel.com>; edk2-devel@lists.01.org
> Cc: Ye, Ting <ting.ye@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu,
> Jiaxin <jiaxin.wu@intel.com>; Jin, Eric <eric.jin@intel.com>
> Subject: RE: [edk2] [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add
> DevPathFromTextDns and DevPathToTextDns libraries
> 
> Jiaxin,
> 
> In V2, the input parameter, TextDeviceNode, in the DevPathFromTextDns()
> is parsed by GetNextParamStr() twice.
> After the first parse, the content of TextDeviceNode is modified and can
> convert to correct device path node.
> 
> Suggest to duplicate the TextDeviceNode or restore the return value of 1st
> GetNextParamStr() for usage in next step. Thanks.
> 
> Best Regards
> Eric
> 
> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of
> Jiaxin Wu
> Sent: Wednesday, July 26, 2017 11:41 AM
> To: edk2-devel@lists.01.org
> Cc: Ye, Ting <ting.ye@intel.com>; Fu, Siyuan <siyuan.fu@intel.com>; Wu,
> Jiaxin <jiaxin.wu@intel.com>
> Subject: [edk2] [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add
> DevPathFromTextDns and DevPathToTextDns libraries
> 
> V2:
> * Add no IP instance case check.
> 
> Cc: Ye Ting <ting.ye@intel.com>
> Cc: Fu Siyuan <siyuan.fu@intel.com>
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Wu Jiaxin <jiaxin.wu@intel.com>
> ---
>  .../Library/UefiDevicePathLib/DevicePathFromText.c | 80
> ++++++++++++++++++++++
>  .../Library/UefiDevicePathLib/DevicePathToText.c   | 46 +++++++++++++
>  2 files changed, 126 insertions(+)
> 
> diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> index f50c11c..3cdc11f 100644
> --- a/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> +++ b/MdePkg/Library/UefiDevicePathLib/DevicePathFromText.c
> @@ -2723,10 +2723,89 @@ DevPathFromTextBluetoothLE (
>      );
>    return (EFI_DEVICE_PATH_PROTOCOL *) BluetoothLeDp;  }
> 
>  /**
> +  Converts a text device path node to DNS device path structure.
> +
> +  @param TextDeviceNode  The input Text device path node.
> +
> +  @return A pointer to the newly-created DNS device path structure.
> +
> +**/
> +EFI_DEVICE_PATH_PROTOCOL *
> +DevPathFromTextDns (
> +  IN CHAR16 *TextDeviceNode
> +  )
> +{
> +  CHAR16            *DeviceNodeStr;
> +  UINT32            DnsServerIpCount;
> +  UINT16            DnsDeviceNodeLength;
> +  DNS_DEVICE_PATH   *DnsDeviceNode;
> +  UINT32            DnsServerIpIndex;
> +  CHAR16            *DnsServerIp;
> +
> +
> +  //
> +  // Count the DNS server address number.
> +  //
> +  DeviceNodeStr    = TextDeviceNode;
> +  DnsServerIpCount = 0;
> +  while (DeviceNodeStr != NULL && *DeviceNodeStr != L'\0') {
> +    GetNextParamStr (&DeviceNodeStr);
> +    DnsServerIpCount ++;
> +  }
> +
> +  //
> +  // One or more instances of the DNS server address in EFI_IP_ADDRESS,
> + // otherwise, NULL will be returned.
> +  //
> +  if (DnsServerIpCount == 0) {
> +    return NULL;
> +  }
> +
> +  //
> +  // Create the DNS DeviceNode.
> +  //
> +  DnsDeviceNodeLength = (UINT16) (sizeof (EFI_DEVICE_PATH_PROTOCOL)
> + sizeof (UINT8) + DnsServerIpCount * sizeof (EFI_IP_ADDRESS));
> +  DnsDeviceNode       = (DNS_DEVICE_PATH *) CreateDeviceNode (
> +                                              MESSAGING_DEVICE_PATH,
> +                                              MSG_DNS_DP,
> +                                              DnsDeviceNodeLength
> +                                              );
> +
> +  //
> +  // Confirm the DNS server address is IPv4 or IPv6 type.
> +  //
> +  DeviceNodeStr = TextDeviceNode;
> +  while (!IS_NULL (*DeviceNodeStr)) {
> +    if (*DeviceNodeStr == L'.') {
> +      DnsDeviceNode->IsIPv6 = 0x00;
> +      break;
> +    }
> +
> +    if (*DeviceNodeStr == L':') {
> +      DnsDeviceNode->IsIPv6 = 0x01;
> +      break;
> +    }
> +
> +    DeviceNodeStr++;
> +  }
> +
> +  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount;
> DnsServerIpIndex++) {
> +    DnsServerIp = GetNextParamStr (&TextDeviceNode);
> +    if (DnsDeviceNode->IsIPv6 == 0x00) {
> +      StrToIpv4Address (DnsServerIp,  NULL, &(DnsDeviceNode-
> >DnsServerIp[DnsServerIpIndex].v4), NULL);
> +    } else {
> +      StrToIpv6Address (DnsServerIp, NULL, &(DnsDeviceNode-
> >DnsServerIp[DnsServerIpIndex].v6), NULL);
> +    }
> +  }
> +
> +  return (EFI_DEVICE_PATH_PROTOCOL *) DnsDeviceNode; }
> +
> +/**
>    Converts a text device path node to URI device path structure.
> 
>    @param TextDeviceNode  The input Text device path node.
> 
>    @return A pointer to the newly-created URI device path structure.
> @@ -3395,10 +3474,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED
> DEVICE_PATH_FROM_TEXT_TABLE mUefiDevicePathLibDevP
>    {L"UsbTestAndMeasurement",
> DevPathFromTextUsbTestAndMeasurement   },
>    {L"UsbWwid",                 DevPathFromTextUsbWwid                 },
>    {L"Unit",                    DevPathFromTextUnit                    },
>    {L"iSCSI",                   DevPathFromTextiSCSI                   },
>    {L"Vlan",                    DevPathFromTextVlan                    },
> +  {L"Dns",                     DevPathFromTextDns                     },
>    {L"Uri",                     DevPathFromTextUri                     },
>    {L"Bluetooth",               DevPathFromTextBluetooth               },
>    {L"Wi-Fi",                   DevPathFromTextWiFi                    },
>    {L"BluetoothLE",             DevPathFromTextBluetoothLE             },
>    {L"MediaPath",               DevPathFromTextMediaPath               },
> diff --git a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> index b8d9491..63542db 100644
> --- a/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> +++ b/MdePkg/Library/UefiDevicePathLib/DevicePathToText.c
> @@ -1695,10 +1695,55 @@ DevPathToTextBluetoothLE (
>      BluetoothLE->Address.Type
>      );
>  }
> 
>  /**
> +  Converts a DNS device path structure to its string representative.
> +
> +  @param Str             The string representative of input device.
> +  @param DevPath         The input device path structure.
> +  @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text
> representation
> +                         of the display node is used, where applicable. If DisplayOnly
> +                         is FALSE, then the longer text representation of the display
> node
> +                         is used.
> +  @param AllowShortcuts  If AllowShortcuts is TRUE, then the shortcut
> forms of text
> +                         representation for a device node can be used, where
> applicable.
> +
> +**/
> +VOID
> +DevPathToTextDns (
> +  IN OUT POOL_PRINT  *Str,
> +  IN VOID            *DevPath,
> +  IN BOOLEAN         DisplayOnly,
> +  IN BOOLEAN         AllowShortcuts
> +  )
> +{
> +  DNS_DEVICE_PATH  *DnsDevPath;
> +  UINT32           DnsServerIpCount;
> +  UINT32           DnsServerIpIndex;
> +
> +  DnsDevPath     = DevPath;
> +  DnsServerIpCount = (UINT32) (DevicePathNodeLength(DnsDevPath) -
> + sizeof (EFI_DEVICE_PATH_PROTOCOL) - sizeof (DnsDevPath->IsIPv6)) /
> + sizeof (EFI_IP_ADDRESS);
> +
> +  UefiDevicePathLibCatPrint (Str, L"Dns(");
> +
> +  for (DnsServerIpIndex = 0; DnsServerIpIndex < DnsServerIpCount;
> DnsServerIpIndex++) {
> +    if (DnsDevPath->IsIPv6 == 0x00) {
> +      CatIPv4Address (Str, &(DnsDevPath-
> >DnsServerIp[DnsServerIpIndex].v4));
> +    } else {
> +      CatIPv6Address (Str, &(DnsDevPath-
> >DnsServerIp[DnsServerIpIndex].v6));
> +    }
> +
> +    if (DnsServerIpIndex < DnsServerIpCount - 1) {
> +      UefiDevicePathLibCatPrint (Str, L",");
> +    }
> +  }
> +
> +  UefiDevicePathLibCatPrint (Str, L")"); }
> +
> +/**
>    Converts a URI device path structure to its string representative.
> 
>    @param Str             The string representative of input device.
>    @param DevPath         The input device path structure.
>    @param DisplayOnly     If DisplayOnly is TRUE, then the shorter text
> representation
> @@ -2223,10 +2268,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED const
> DEVICE_PATH_TO_TEXT_TABLE mUefiDevicePathLib
>    {MESSAGING_DEVICE_PATH, MSG_INFINIBAND_DP,
> DevPathToTextInfiniBand     },
>    {MESSAGING_DEVICE_PATH, MSG_UART_DP,
> DevPathToTextUart           },
>    {MESSAGING_DEVICE_PATH, MSG_VENDOR_DP,
> DevPathToTextVendor         },
>    {MESSAGING_DEVICE_PATH, MSG_ISCSI_DP,
> DevPathToTextiSCSI          },
>    {MESSAGING_DEVICE_PATH, MSG_VLAN_DP,
> DevPathToTextVlan           },
> +  {MESSAGING_DEVICE_PATH, MSG_DNS_DP,
> DevPathToTextDns            },
>    {MESSAGING_DEVICE_PATH, MSG_URI_DP,
> DevPathToTextUri            },
>    {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_DP,
> DevPathToTextBluetooth      },
>    {MESSAGING_DEVICE_PATH, MSG_WIFI_DP,
> DevPathToTextWiFi           },
>    {MESSAGING_DEVICE_PATH, MSG_BLUETOOTH_LE_DP,
> DevPathToTextBluetoothLE    },
>    {MEDIA_DEVICE_PATH,     MEDIA_HARDDRIVE_DP,
> DevPathToTextHardDrive      },
> --
> 1.9.5.msysgit.1
> 
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2017-08-03  5:09 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-26  3:41 [PATCH v2][Patch 2/4] MdePkg/UefiDevicePathLib: Add DevPathFromTextDns and DevPathToTextDns libraries Jiaxin Wu
2017-07-26  3:48 ` Fu, Siyuan
2017-08-03  5:10 ` Jin, Eric
2017-08-03  5:12   ` Wu, Jiaxin

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox