summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHariharasubramanian R <hramasub@in.ibm.com>2015-10-20 07:28:19 -0500
committerPatrick Williams <patrick@stwcx.xyz>2015-10-31 23:08:38 -0500
commita032c779685e8a85cf5788b5f5ee87187397fef0 (patch)
treed373a11ca8cb115be03d59b37ac38e604540b339
parent4a0b6fbcec075dd357ca1cccf6734412003a6366 (diff)
downloadipmi-fru-parser-a032c779685e8a85cf5788b5f5ee87187397fef0.tar.gz
ipmi-fru-parser-a032c779685e8a85cf5788b5f5ee87187397fef0.zip
Use field type encoding for dbus message format.
-rw-r--r--frup.c303
-rw-r--r--frup.h4
2 files changed, 191 insertions, 116 deletions
diff --git a/frup.c b/frup.c
index 7979f70..7bdf35f 100644
--- a/frup.c
+++ b/frup.c
@@ -1,6 +1,6 @@
/*
* Copyright (C) 2003-2014 FreeIPMI Core Team
- *
+ *
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
@@ -13,7 +13,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
+ *
*/
/*****************************************************************************\
* Copyright (C) 2007-2014 Lawrence Livermore National Security, LLC.
@@ -44,8 +44,8 @@
#include <string.h>
#include <time.h>
#include <systemd/sd-bus.h>
+#include <ctype.h>
-#define IPMI_FRU_PARSER_DEBUG 1
#define uint8_t unsigned char
#define uint32_t unsigned int
@@ -89,8 +89,8 @@ struct ipmi_fru_field
};
typedef struct ipmi_fru_field ipmi_fru_field_t;
-/*
- * FRU Parser
+/*
+ * FRU Parser
*/
typedef struct ipmi_fru_area_info
@@ -114,7 +114,15 @@ enum openbmc_vpd_key_id
OPENBMC_VPD_KEY_CHASSIS_TYPE = 1, /* not a type/len */
OPENBMC_VPD_KEY_CHASSIS_PART_NUM,
OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,
- OPENBMC_VPD_KEY_CHASSIS_MAX = OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM1,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM2,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM3,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM4,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM5,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM6,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM7,
+ OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
+ OPENBMC_VPD_KEY_CHASSIS_MAX = OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,
/* TODO: chassis_custom_fields */
OPENBMC_VPD_KEY_BOARD_MFG_DATE, /* not a type/len */
@@ -123,7 +131,15 @@ enum openbmc_vpd_key_id
OPENBMC_VPD_KEY_BOARD_SERIAL_NUM,
OPENBMC_VPD_KEY_BOARD_PART_NUM,
OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID,
- OPENBMC_VPD_KEY_BOARD_MAX = OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM1,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM2,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM3,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM4,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM5,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM6,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM7,
+ OPENBMC_VPD_KEY_BOARD_CUSTOM8,
+ OPENBMC_VPD_KEY_BOARD_MAX = OPENBMC_VPD_KEY_BOARD_CUSTOM8,
/* TODO: board_custom_fields */
OPENBMC_VPD_KEY_PRODUCT_MFR,
@@ -133,38 +149,66 @@ enum openbmc_vpd_key_id
OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM,
OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG,
OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID,
- OPENBMC_VPD_KEY_PRODUCT_MAX = OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID,
- /* TODO: product_custom_fields */
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM1,
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM2,
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM3,
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM4,
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM5,
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM6,
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM7,
+ OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
+ OPENBMC_VPD_KEY_PRODUCT_MAX = OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,
OPENBMC_VPD_KEY_MAX,
-
+ OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX=8,
+
};
-const char* vpd_key_names [] =
+const char* vpd_key_names [] =
{
- "Key Names Table Start",
- "Chassis Type", /*OPENBMC_VPD_KEY_CHASSIS_TYPE*/
- "Chassis Part Number", /*OPENBMC_VPD_KEY_CHASSIS_PART_NUM,*/
- "Chassis Serial Number", /*OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,*/
-
- /* TODO: chassis_custom_fields */
-
- "Board Mfg Date", /* OPENBMC_VPD_KEY_BOARD_MFG_DATE, */ /* not a type/len */
- "Board Manufacturer", /* OPENBMC_VPD_KEY_BOARD_MFR, */
- "Board Name", /* OPENBMC_VPD_KEY_BOARD_NAME, */
- "Board Serial Number", /* OPENBMC_VPD_KEY_BOARD_SERIAL_NUM, */
- "Board Part Number", /* OPENBMC_VPD_KEY_BOARD_PART_NUM, */
- "Board FRU File ID", /* OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID, */
- /* TODO: board_custom_fields */
-
- "Product Manufacturer", /* OPENBMC_VPD_KEY_PRODUCT_MFR, */
- "Product Name", /* OPENBMC_VPD_KEY_PRODUCT_NAME, */
- "Product Model Number", /* OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM, */
- "Product Version", /* OPENBMC_VPD_KEY_PRODUCT_VER, */
- "Product Serial Number", /* OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM, */
- "Product Asset Tag", /* OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG, */
- "Product FRU File ID", /* OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID, */
- /* TODO: product_custom_fields */
+ "Key Names Table Start",
+ "Type", /*OPENBMC_VPD_KEY_CHASSIS_TYPE*/
+ "Part Number", /*OPENBMC_VPD_KEY_CHASSIS_PART_NUM,*/
+ "Serial Number", /*OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM,*/
+ "Custom Field 1", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM1,*/
+ "Custom Field 2", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM2,*/
+ "Custom Field 3", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM3,*/
+ "Custom Field 4", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM4,*/
+ "Custom Field 5", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM5,*/
+ "Custom Field 6", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM6,*/
+ "Custom Field 7", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM7,*/
+ "Custom Field 8", /*OPENBMC_VPD_KEY_CHASSIS_CUSTOM8,*/
+
+ "Mfg Date", /* OPENBMC_VPD_KEY_BOARD_MFG_DATE, */ /* not a type/len */
+ "Manufacturer", /* OPENBMC_VPD_KEY_BOARD_MFR, */
+ "Name", /* OPENBMC_VPD_KEY_BOARD_NAME, */
+ "Serial Number", /* OPENBMC_VPD_KEY_BOARD_SERIAL_NUM, */
+ "Part Number", /* OPENBMC_VPD_KEY_BOARD_PART_NUM, */
+ "FRU File ID", /* OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID, */
+ "Custom Field 1", /*OPENBMC_VPD_KEY_BOARD_CUSTOM1,*/
+ "Custom Field 2", /*OPENBMC_VPD_KEY_BOARD_CUSTOM2,*/
+ "Custom Field 3", /*OPENBMC_VPD_KEY_BOARD_CUSTOM3,*/
+ "Custom Field 4", /*OPENBMC_VPD_KEY_BOARD_CUSTOM4,*/
+ "Custom Field 5", /*OPENBMC_VPD_KEY_BOARD_CUSTOM5,*/
+ "Custom Field 6", /*OPENBMC_VPD_KEY_BOARD_CUSTOM6,*/
+ "Custom Field 7", /*OPENBMC_VPD_KEY_BOARD_CUSTOM7,*/
+ "Custom Field 8", /*OPENBMC_VPD_KEY_BOARD_CUSTOM8,*/
+
+ "Manufacturer", /* OPENBMC_VPD_KEY_PRODUCT_MFR, */
+ "Name", /* OPENBMC_VPD_KEY_PRODUCT_NAME, */
+ "Model Number", /* OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM, */
+ "Version", /* OPENBMC_VPD_KEY_PRODUCT_VER, */
+ "Serial Number", /* OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM, */
+ "Asset Tag", /* OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG, */
+ "FRU File ID", /* OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID, */
+ "Custom Field 1", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM1,*/
+ "Custom Field 2", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM2,*/
+ "Custom Field 3", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM3,*/
+ "Custom Field 4", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM4,*/
+ "Custom Field 5", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM5,*/
+ "Custom Field 6", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM6,*/
+ "Custom Field 7", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM7,*/
+ "Custom Field 8", /*OPENBMC_VPD_KEY_PRODUCT_CUSTOM8,*/
"Key Names Table End" /*OPENBMC_VPD_KEY_MAX,*/
};
@@ -209,10 +253,10 @@ _parse_type_length (const void *areabuf,
ASSERT (areabuf);
ASSERT (areabuflen);
ASSERT (number_of_data_bytes);
-
+
type_length = areabufptr[current_area_offset];
- /* ipmi workaround
+ /* ipmi workaround
*
* dell p weredge r610
*
@@ -253,10 +297,10 @@ _parse_type_length (const void *areabuf,
1 + (*number_of_data_bytes));
field->type_length_field_length = 1 + (*number_of_data_bytes);
}
-
+
return (0);
}
-
+
int
ipmi_fru_chassis_info_area (const void *areabuf,
unsigned int areabuflen,
@@ -418,7 +462,7 @@ ipmi_fru_board_info_area (const void *areabuf,
area_offset++;
mfg_date_time_tmp |= (areabufptr[area_offset] << 16);
area_offset++;
-
+
/* mfg_date_time is in minutes, so multiple by 60 to get seconds */
mfg_date_time_tmp *= 60;
@@ -688,6 +732,7 @@ ipmi_fru_product_info_area (const void *areabuf,
&number_of_data_bytes,
product_fru_file_id) < 0)
goto cleanup;
+
area_offset += 1; /* type/length byte */
area_offset += number_of_data_bytes;
@@ -726,12 +771,42 @@ ipmi_fru_product_info_area (const void *areabuf,
}
+int _append_to_dict (uint8_t vpd_key_id, uint8_t* vpd_key_val, sd_bus_message* vpdtbl)
+{
+ int type_length = vpd_key_val[0];
+ int type_code = (type_length & IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK) >> IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT;
+ int vpd_val_len = type_length & IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK;
+ int sdr=0;
+
+ switch (type_code)
+ {
+ case 0:
+ printf ("_append_to_dict: VPD Key = [%s] : Type Code = [BINARY] : Len = [%d] : Val = [%s]\n", vpd_key_names [vpd_key_id], vpd_val_len, &vpd_key_val[1]);
+ sdr = sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[vpd_key_id], "ay", vpd_val_len, &vpd_key_val[1]);
+ /*sdr = sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[vpd_key_id], "s", &vpd_key_val[1]);*/
+ break;
+ case 3:
+ printf ("_append_to_dict: VPD Key = [%s] : Type Code = [ASCII+Latin] : Len = [%d] : Val = [%s]\n", vpd_key_names [vpd_key_id], vpd_val_len, &vpd_key_val[1]);
+ sdr = sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[vpd_key_id], "s", &vpd_key_val[1]);
+ break;
+ }
+
+ if (sdr < 0)
+ {
+#if IPMI_FRU_PARSER_DEBUG
+ printf ("_append_to_dict : sd_bus_message_append Failed [ %d ] for [%s]\n", sdr, vpd_key_names[vpd_key_id]);
+#endif
+ }
+}
+
int
parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
{
int ret = 0;
int rv = -1;
int i = 0;
+ int j = 0;
+ int isprintable = 0;
ipmi_fru_area_info_t fru_area_info [ IPMI_FRU_AREA_TYPE_MAX ];
ipmi_fru_common_hdr_t* chdr = NULL;
uint8_t* hdr = NULL;
@@ -739,9 +814,7 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
ipmi_fru_field_t vpd_info [ OPENBMC_VPD_KEY_MAX ];
- /*char ipmi_fru_field_str [ IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX ];
- uint32_t len=0;*/
- const uint8_t* ipmi_fru_field_str;
+ uint8_t* ipmi_fru_field_str;
/* Chassis */
uint8_t chassis_type;
@@ -779,7 +852,7 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
if (chdr->internal)
{
fru_area_info [ IPMI_FRU_AREA_INTERNAL_USE ].len = 8*(*(hdr+8*chdr->internal+1));
-
+
/* TODO: Parse internal use area */
}
@@ -791,9 +864,10 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
&chassis_type,
&vpd_info [OPENBMC_VPD_KEY_CHASSIS_PART_NUM],
&vpd_info [OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM],
- NULL, 0);
+ &vpd_info [OPENBMC_VPD_KEY_CHASSIS_CUSTOM1],
+ OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
}
-
+
if (chdr->board)
{
fru_area_info [ IPMI_FRU_AREA_BOARD_INFO ].len = 8*(*(hdr+8*chdr->board+1));
@@ -806,7 +880,8 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
&vpd_info [OPENBMC_VPD_KEY_BOARD_SERIAL_NUM],
&vpd_info [OPENBMC_VPD_KEY_BOARD_PART_NUM],
&vpd_info [OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID],
- NULL, 0);
+ &vpd_info [OPENBMC_VPD_KEY_BOARD_CUSTOM1],
+ OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
}
if (chdr->product)
@@ -822,7 +897,8 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
&vpd_info [OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM],
&vpd_info [OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG],
&vpd_info [OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID],
- NULL, 0);
+ &vpd_info [OPENBMC_VPD_KEY_PRODUCT_CUSTOM1],
+ OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
}
if (chdr->multirec)
@@ -835,8 +911,6 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
{
#if IPMI_FRU_PARSER_DEBUG
printf ("IPMI_FRU_AREA_TYPE=[%d] : Offset=[%d] : Len=[%d]\n", i, fru_area_info [i].off, fru_area_info[i].len);
-#else
-;
#endif
}
@@ -848,8 +922,6 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "y", chassis_type);
#if IPMI_FRU_PARSER_DEBUG
printf ("[%s] = [%d]\n", vpd_key_names[i], chassis_type);
-#else
-;
#endif
continue;
}
@@ -860,25 +932,16 @@ parse_fru (const void* msgbuf, sd_bus_message* vpdtbl)
sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", timestr);
#if IPMI_FRU_PARSER_DEBUG
printf ("[%s] = [%d]\n", vpd_key_names[i], mfg_date_time);
-#else
-;
#endif
continue;
}
-
- /* FIXME: Field type encoding *ASSUMED* to be *BINARY* */
- ipmi_fru_field_str = (unsigned char*) &(vpd_info[i].type_length_field) + 1;
- sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", ipmi_fru_field_str);
- if (vpd_info[i].type_length_field_length)
- {
-#if IPMI_FRU_PARSER_DEBUG
- printf ("[%s] = [%s]\n", vpd_key_names[i], ipmi_fru_field_str);
-#else
-;
-#endif
- }
- }
+ /* Append TypeLen Field to Dictionary */
+ _append_to_dict (i, vpd_info[i].type_length_field, vpdtbl);
+
+ /*ipmi_fru_field_str = (unsigned char*) &(vpd_info[i].type_length_field) + 1;*/
+ /*sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", ipmi_fru_field_str); */
+ }
out:
rv = 0;
cleanup:
@@ -890,66 +953,72 @@ int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, s
int ret = 0;
int rv = -1;
int i = 0;
- ipmi_fru_area_info_t fru_area_info [ IPMI_FRU_AREA_TYPE_MAX ];
- ipmi_fru_common_hdr_t* chdr = NULL;
- uint8_t* hdr = NULL;
- const uint8_t* ipmi_fru_field_str=NULL;
- char timestr [ OPENBMC_VPD_VAL_LEN ];
-
-
- ipmi_fru_field_t vpd_info [ OPENBMC_VPD_KEY_MAX ];
- for (i=0; i<OPENBMC_VPD_KEY_MAX; i++)
- {
- memset (vpd_info[i].type_length_field, '\0', IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX);
- vpd_info[i].type_length_field_length = 0;
- }
+ int j = 0;
+ int sdr = 0;
+ int isprintable = 0;
/* Chassis */
uint8_t chassis_type;
-
/* Board */
uint32_t mfg_date_time;
-
/* Product */
unsigned int product_custom_fields_len;
+ ipmi_fru_area_info_t fru_area_info [ IPMI_FRU_AREA_TYPE_MAX ];
+ ipmi_fru_field_t vpd_info [ OPENBMC_VPD_KEY_MAX ];
+ char timestr [ OPENBMC_VPD_VAL_LEN ];
+
+ uint8_t* ipmi_fru_field_str=NULL;
+ ipmi_fru_common_hdr_t* chdr = NULL;
+ uint8_t* hdr = NULL;
+
ASSERT (msgbuf);
ASSERT (vpdtbl);
+ for (i=0; i<OPENBMC_VPD_KEY_MAX; i++)
+ {
+ memset (vpd_info[i].type_length_field, '\0', IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX);
+ vpd_info[i].type_length_field_length = 0;
+ }
+
switch (area)
{
case IPMI_FRU_AREA_CHASSIS_INFO:
- ipmi_fru_chassis_info_area (msgbuf,
+#if IPMI_FRU_PARSER_DEBUG
+ printf ("Chassis : Buf len = [%d]\n", len);
+#endif
+ ipmi_fru_chassis_info_area ((uint8_t*)msgbuf+2,
len,
&chassis_type,
&vpd_info [OPENBMC_VPD_KEY_CHASSIS_PART_NUM],
&vpd_info [OPENBMC_VPD_KEY_CHASSIS_SERIAL_NUM],
- NULL, 0);
+ &vpd_info [OPENBMC_VPD_KEY_CHASSIS_CUSTOM1],
+ OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
/* Populate VPD Table */
for (i=1; i<=OPENBMC_VPD_KEY_CHASSIS_MAX; i++)
{
if (i==OPENBMC_VPD_KEY_CHASSIS_TYPE)
{
- sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "y", chassis_type);
#if IPMI_FRU_PARSER_DEBUG
- printf ("Chassis : [%s] = [%d]\n", vpd_key_names[i], chassis_type);
-#else
-;
+ printf ("Chassis : Appending [%s] = [%d]\n", vpd_key_names[i], chassis_type);
#endif
+ sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "y", chassis_type);
continue;
}
+
+ _append_to_dict (i, vpd_info[i].type_length_field, vpdtbl);
+/*
ipmi_fru_field_str = (unsigned char*) &(vpd_info[i].type_length_field) + 1;
- sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", ipmi_fru_field_str);
-#if IPMI_FRU_PARSER_DEBUG
- printf ("Chassis : [%s] = [%s]\n", vpd_key_names[i], ipmi_fru_field_str);
-#else
-;
-#endif
+ sdr = sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", ipmi_fru_field_str);
+*/
}
break;
case IPMI_FRU_AREA_BOARD_INFO:
- ipmi_fru_board_info_area (msgbuf,
+#if IPMI_FRU_PARSER_DEBUG
+ printf ("Board : Buf len = [%d]\n", len);
+#endif
+ ipmi_fru_board_info_area ((uint8_t*)msgbuf+2,
len,
NULL,
&mfg_date_time,
@@ -958,7 +1027,8 @@ int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, s
&vpd_info [OPENBMC_VPD_KEY_BOARD_SERIAL_NUM],
&vpd_info [OPENBMC_VPD_KEY_BOARD_PART_NUM],
&vpd_info [OPENBMC_VPD_KEY_BOARD_FRU_FILE_ID],
- NULL, 0);
+ &vpd_info [OPENBMC_VPD_KEY_BOARD_CUSTOM1],
+ OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
/* Populate VPD Table */
for (i=OPENBMC_VPD_KEY_BOARD_MFR; i<=OPENBMC_VPD_KEY_BOARD_MAX; i++)
@@ -966,25 +1036,31 @@ int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, s
if (i==OPENBMC_VPD_KEY_BOARD_MFG_DATE)
{
_to_time_str (mfg_date_time, timestr, OPENBMC_VPD_VAL_LEN);
- sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", timestr);
#if IPMI_FRU_PARSER_DEBUG
- printf ("Board : [%s] = [%d]\n", vpd_key_names[i], mfg_date_time);
-#else
-;
+ printf ("Board : Appending [%s] = [%d]\n", vpd_key_names[i], timestr);
+#endif
+ sdr = sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", timestr);
+ if (sdr < 0)
+ {
+#if IPMI_FRU_PARSER_DEBUG
+ printf ("ipmi_fru_board_info_area : sd_bus_message_append Failed [ %d ] for [%s]\n", sdr, vpd_key_names[i]);
#endif
+ }
continue;
}
+
+ _append_to_dict (i, vpd_info[i].type_length_field, vpdtbl);
+/*
ipmi_fru_field_str = (unsigned char*) &(vpd_info[i].type_length_field) + 1;
- sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", ipmi_fru_field_str);
-#if IPMI_FRU_PARSER_DEBUG
- printf ("Board : [%s] = [%s]\n", vpd_key_names[i], ipmi_fru_field_str);
-#else
-;
-#endif
+ sdr = sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", ipmi_fru_field_str);
+*/
}
break;
case IPMI_FRU_AREA_PRODUCT_INFO:
- ipmi_fru_product_info_area (msgbuf,
+#if IPMI_FRU_PARSER_DEBUG
+ printf ("Product : Buf len = [%d]\n", len);
+#endif
+ ipmi_fru_product_info_area ((uint8_t*)msgbuf+2,
len,
NULL,
&vpd_info [OPENBMC_VPD_KEY_PRODUCT_MFR],
@@ -994,16 +1070,12 @@ int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, s
&vpd_info [OPENBMC_VPD_KEY_PRODUCT_SERIAL_NUM],
&vpd_info [OPENBMC_VPD_KEY_PRODUCT_ASSET_TAG],
&vpd_info [OPENBMC_VPD_KEY_PRODUCT_FRU_FILE_ID],
- NULL, 0);
+ &vpd_info [OPENBMC_VPD_KEY_PRODUCT_CUSTOM1],
+ OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX);
+
for (i=OPENBMC_VPD_KEY_PRODUCT_MFR; i<=OPENBMC_VPD_KEY_PRODUCT_MAX; i++)
{
- ipmi_fru_field_str = (unsigned char*) &(vpd_info[i].type_length_field) + 1;
- sd_bus_message_append (vpdtbl, "{sv}", vpd_key_names[i], "s", ipmi_fru_field_str);
-#if IPMI_FRU_PARSER_DEBUG
- printf ("Product : [%s] = [%s]\n", vpd_key_names[i], ipmi_fru_field_str);
-#else
-;
-#endif
+ _append_to_dict (i, vpd_info[i].type_length_field, vpdtbl);
}
break;
defualt:
@@ -1011,6 +1083,9 @@ int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, s
break;
}
+#if IPMI_FRU_PARSER_DEBUG
+ printf ("parse_fru_area : Dictionary Packing Complete\n");
+#endif
out:
rv = 0;
cleanup:
diff --git a/frup.h b/frup.h
index b6b9476..0269bf8 100644
--- a/frup.h
+++ b/frup.h
@@ -5,7 +5,7 @@
int parse_fru (const void* msgbuf, sd_bus_message* vpdtbl);
int parse_fru_area (const uint8_t area, const void* msgbuf, const uint8_t len, sd_bus_message* vpdtbl);
-enum openbmc_ipmi_fru_area_type
+enum ipmi_fru_area_type
{
IPMI_FRU_AREA_INTERNAL_USE = 0x00,
IPMI_FRU_AREA_CHASSIS_INFO,
@@ -13,6 +13,6 @@ enum openbmc_ipmi_fru_area_type
IPMI_FRU_AREA_PRODUCT_INFO,
IPMI_FRU_AREA_MULTI_RECORD,
IPMI_FRU_AREA_TYPE_MAX
-}
+};
#endif
OpenPOWER on IntegriCloud