diff options
author | Hariharasubramanian R <hramasub@in.ibm.com> | 2015-10-20 07:28:19 -0500 |
---|---|---|
committer | Patrick Williams <patrick@stwcx.xyz> | 2015-10-31 23:08:38 -0500 |
commit | a032c779685e8a85cf5788b5f5ee87187397fef0 (patch) | |
tree | d373a11ca8cb115be03d59b37ac38e604540b339 | |
parent | 4a0b6fbcec075dd357ca1cccf6734412003a6366 (diff) | |
download | ipmi-fru-parser-a032c779685e8a85cf5788b5f5ee87187397fef0.tar.gz ipmi-fru-parser-a032c779685e8a85cf5788b5f5ee87187397fef0.zip |
Use field type encoding for dbus message format.
-rw-r--r-- | frup.c | 303 | ||||
-rw-r--r-- | frup.h | 4 |
2 files changed, 191 insertions, 116 deletions
@@ -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: @@ -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 |