Skip to content

Commit

Permalink
lib: uuid: code refactor for proper maintain between uuid bin and string
Browse files Browse the repository at this point in the history
Changes in lib/uuid.c to:
- uuid_str_to_bin()
- uuid_bin_to_str()

New parameter is added to specify input/output string format in listed functions
This change allows easy recognize which UUID type is or should be stored in given
string array. Binary data of UUID and GUID is always stored in big endian, only
string representations are different as follows.

String byte: 0                                  36
String char: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
string UUID:    be     be   be   be       be
string GUID:    le     le   le   be       be

This patch also updates functions calls and declarations in a whole code.

Signed-off-by: Przemyslaw Marczak <[email protected]>
Cc: Stephen Warren <[email protected]>
Cc: Lukasz Majewski <[email protected]>
Cc: [email protected]
  • Loading branch information
bobenstein authored and trini committed Apr 2, 2014
1 parent a96a0e6 commit d718ded
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 36 deletions.
17 changes: 9 additions & 8 deletions disk/part_efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ void print_part_efi(block_dev_desc_t * dev_desc)

printf("Part\tStart LBA\tEnd LBA\t\tName\n");
printf("\tAttributes\n");
printf("\tType UUID\n");
printf("\tPartition UUID\n");
printf("\tType GUID\n");
printf("\tPartition GUID\n");

for (i = 0; i < le32_to_cpu(gpt_head->num_partition_entries); i++) {
/* Stop at the first non valid PTE */
Expand All @@ -114,11 +114,11 @@ void print_part_efi(block_dev_desc_t * dev_desc)
print_efiname(&gpt_pte[i]));
printf("\tattrs:\t0x%016llx\n", gpt_pte[i].attributes.raw);
uuid_bin = (unsigned char *)gpt_pte[i].partition_type_guid.b;
uuid_bin_to_str(uuid_bin, uuid);
uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
printf("\ttype:\t%s\n", uuid);
uuid_bin = (unsigned char *)gpt_pte[i].unique_partition_guid.b;
uuid_bin_to_str(uuid_bin, uuid);
printf("\tuuid:\t%s\n", uuid);
uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
printf("\tguid:\t%s\n", uuid);
}

/* Remember to free pte */
Expand Down Expand Up @@ -165,7 +165,8 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
sprintf((char *)info->type, "U-Boot");
info->bootable = is_bootable(&gpt_pte[part - 1]);
#ifdef CONFIG_PARTITION_UUIDS
uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid);
uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid,
UUID_STR_FORMAT_GUID);
#endif

debug("%s: start 0x" LBAF ", size 0x" LBAF ", name %s", __func__,
Expand Down Expand Up @@ -323,7 +324,7 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
str_uuid = partitions[i].uuid;
bin_uuid = gpt_e[i].unique_partition_guid.b;

if (uuid_str_to_bin(str_uuid, bin_uuid)) {
if (uuid_str_to_bin(str_uuid, bin_uuid, UUID_STR_FORMAT_STD)) {
printf("Partition no. %d: invalid guid: %s\n",
i, str_uuid);
return -1;
Expand Down Expand Up @@ -370,7 +371,7 @@ int gpt_fill_header(block_dev_desc_t *dev_desc, gpt_header *gpt_h,
gpt_h->header_crc32 = 0;
gpt_h->partition_entry_array_crc32 = 0;

if (uuid_str_to_bin(str_guid, gpt_h->disk_guid.b))
if (uuid_str_to_bin(str_guid, gpt_h->disk_guid.b, UUID_STR_FORMAT_GUID))
return -1;

return 0;
Expand Down
4 changes: 1 addition & 3 deletions include/common.h
Original file line number Diff line number Diff line change
Expand Up @@ -822,9 +822,7 @@ void udelay (unsigned long);
void mdelay(unsigned long);

/* lib/uuid.c */
void uuid_bin_to_str(unsigned char *uuid, char *str);
int uuid_str_to_bin(char *uuid, unsigned char *out);
int uuid_str_valid(const char *uuid);
#include <uuid.h>

/* lib/vsprintf.c */
#include <vsprintf.h>
Expand Down
21 changes: 21 additions & 0 deletions include/uuid.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Copyright (C) 2014 Samsung Electronics
* Przemyslaw Marczak <[email protected]>
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef __UUID_H__
#define __UUID_H__

enum {
UUID_STR_FORMAT_STD,
UUID_STR_FORMAT_GUID
};

#define UUID_STR_LEN 36
#define UUID_BIN_LEN 16

int uuid_str_valid(const char *uuid);
int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format);
void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format);
#endif
83 changes: 59 additions & 24 deletions lib/uuid.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
#include <linux/ctype.h>
#include <errno.h>
#include <common.h>

#define UUID_STR_LEN 36
#include <asm/io.h>
#include <part_efi.h>
#include <malloc.h>

/*
* UUID - Universally Unique IDentifier - 128 bits unique number.
Expand Down Expand Up @@ -40,7 +41,6 @@
*
* GUID is used e.g. in GPT (GUID Partition Table) as a partiions unique id.
*/

int uuid_str_valid(const char *uuid)
{
int i, valid;
Expand All @@ -59,57 +59,92 @@ int uuid_str_valid(const char *uuid)
}
}

if (i != 36 || !valid)
if (i != UUID_STR_LEN || !valid)
return 0;

return 1;
}

int uuid_str_to_bin(char *uuid, unsigned char *out)
/*
* uuid_str_to_bin() - convert string UUID or GUID to big endian binary data.
*
* @param uuid_str - pointer to UUID or GUID string [37B]
* @param uuid_bin - pointer to allocated array for big endian output [16B]
* @str_format - UUID string format: 0 - UUID; 1 - GUID
*/
int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format)
{
uint16_t tmp16;
uint32_t tmp32;
uint64_t tmp64;

if (!uuid || !out)
if (!uuid_str_valid(uuid_str))
return -EINVAL;

if (strlen(uuid) != UUID_STR_LEN)
return -EINVAL;
if (str_format == UUID_STR_FORMAT_STD) {
tmp32 = cpu_to_be32(simple_strtoul(uuid_str, NULL, 16));
memcpy(uuid_bin, &tmp32, 4);

tmp32 = cpu_to_le32(simple_strtoul(uuid, NULL, 16));
memcpy(out, &tmp32, 4);
tmp16 = cpu_to_be16(simple_strtoul(uuid_str + 9, NULL, 16));
memcpy(uuid_bin + 4, &tmp16, 2);

tmp16 = cpu_to_le16(simple_strtoul(uuid + 9, NULL, 16));
memcpy(out + 4, &tmp16, 2);
tmp16 = cpu_to_be16(simple_strtoul(uuid_str + 14, NULL, 16));
memcpy(uuid_bin + 6, &tmp16, 2);
} else {
tmp32 = cpu_to_le32(simple_strtoul(uuid_str, NULL, 16));
memcpy(uuid_bin, &tmp32, 4);

tmp16 = cpu_to_le16(simple_strtoul(uuid + 14, NULL, 16));
memcpy(out + 6, &tmp16, 2);
tmp16 = cpu_to_le16(simple_strtoul(uuid_str + 9, NULL, 16));
memcpy(uuid_bin + 4, &tmp16, 2);

tmp16 = cpu_to_be16(simple_strtoul(uuid + 19, NULL, 16));
memcpy(out + 8, &tmp16, 2);
tmp16 = cpu_to_le16(simple_strtoul(uuid_str + 14, NULL, 16));
memcpy(uuid_bin + 6, &tmp16, 2);
}

tmp16 = cpu_to_be16(simple_strtoul(uuid_str + 19, NULL, 16));
memcpy(uuid_bin + 8, &tmp16, 2);

tmp64 = cpu_to_be64(simple_strtoull(uuid + 24, NULL, 16));
memcpy(out + 10, (char *)&tmp64 + 2, 6);
tmp64 = cpu_to_be64(simple_strtoull(uuid_str + 24, NULL, 16));
memcpy(uuid_bin + 10, (char *)&tmp64 + 2, 6);

return 0;
}

void uuid_bin_to_str(unsigned char *uuid, char *str)
/*
* uuid_bin_to_str() - convert big endian binary data to string UUID or GUID.
*
* @param uuid_bin - pointer to binary data of UUID (big endian) [16B]
* @param uuid_str - pointer to allocated array for output string [37B]
* @str_format - UUID string format: 0 - UUID; 1 - GUID
*/
void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format)
{
static const u8 le[16] = {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11,
12, 13, 14, 15};
const u8 uuid_char_order[UUID_BIN_LEN] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15};
const u8 guid_char_order[UUID_BIN_LEN] = {3, 2, 1, 0, 5, 4, 7, 6, 8,
9, 10, 11, 12, 13, 14, 15};
const u8 *char_order;
int i;

/*
* UUID and GUID bin data - always in big endian:
* 4B-2B-2B-2B-6B
* be be be be be
*/
if (str_format == UUID_STR_FORMAT_STD)
char_order = uuid_char_order;
else
char_order = guid_char_order;

for (i = 0; i < 16; i++) {
sprintf(str, "%02x", uuid[le[i]]);
str += 2;
sprintf(uuid_str, "%02x", uuid_bin[char_order[i]]);
uuid_str += 2;
switch (i) {
case 3:
case 5:
case 7:
case 9:
*str++ = '-';
*uuid_str++ = '-';
break;
}
}
Expand Down
2 changes: 1 addition & 1 deletion net/bootp.c
Original file line number Diff line number Diff line change
Expand Up @@ -439,7 +439,7 @@ static int DhcpExtended(u8 *e, int message_type, IPaddr_t ServerID,
*e++ = 17;
*e++ = 0; /* type 0 - UUID */

uuid_str_to_bin(uuid, e);
uuid_str_to_bin(uuid, e, UUID_STR_FORMAT_STD);
e += 16;
} else {
printf("Invalid pxeuuid: %s\n", uuid);
Expand Down

0 comments on commit d718ded

Please sign in to comment.