diff options
Diffstat (limited to 'frup.cpp')
-rw-r--r-- | frup.cpp | 1242 |
1 files changed, 569 insertions, 673 deletions
@@ -39,52 +39,53 @@ * You should have received a copy of the GNU General Public License along * with Ipmi-fru. If not, see <http://www.gnu.org/licenses/>. \*****************************************************************************/ +#include "frup.hpp" + +#include <ctype.h> #include <stdio.h> #include <stdlib.h> -#include <unistd.h> #include <string.h> -#include <time.h> #include <systemd/sd-bus.h> -#include <ctype.h> -#include "frup.hpp" +#include <time.h> +#include <unistd.h> #define TEXTSTR(a) #a -# define ASSERT(x) \ -do { \ -if (0 == (x)) { \ -fprintf(stderr, \ -"Assertion failed: %s, " \ -"%d at \'%s\'\n", \ -__FILE__, \ -__LINE__, \ -TEXTSTR(a)); \ -return -1; \ -} \ -} while (0) - -#define IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX 512 -#define IPMI_FRU_SENTINEL_VALUE 0xC1 -#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK 0xC0 -#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT 0x06 +#define ASSERT(x) \ + do \ + { \ + if (0 == (x)) \ + { \ + fprintf(stderr, \ + "Assertion failed: %s, " \ + "%d at \'%s\'\n", \ + __FILE__, __LINE__, TEXTSTR(a)); \ + return -1; \ + } \ + } while (0) + +#define IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX 512 +#define IPMI_FRU_SENTINEL_VALUE 0xC1 +#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK 0xC0 +#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT 0x06 #define IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK 0x3F -#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE 0x03 +#define IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE 0x03 /* OpenBMC defines for Parser */ -#define IPMI_FRU_AREA_INTERNAL_USE 0x00 -#define IPMI_FRU_AREA_CHASSIS_INFO 0x01 -#define IPMI_FRU_AREA_BOARD_INFO 0x02 -#define IPMI_FRU_AREA_PRODUCT_INFO 0x03 -#define IPMI_FRU_AREA_MULTI_RECORD 0x04 -#define IPMI_FRU_AREA_TYPE_MAX 0x05 +#define IPMI_FRU_AREA_INTERNAL_USE 0x00 +#define IPMI_FRU_AREA_CHASSIS_INFO 0x01 +#define IPMI_FRU_AREA_BOARD_INFO 0x02 +#define IPMI_FRU_AREA_PRODUCT_INFO 0x03 +#define IPMI_FRU_AREA_MULTI_RECORD 0x04 +#define IPMI_FRU_AREA_TYPE_MAX 0x05 -#define OPENBMC_VPD_KEY_LEN 64 -#define OPENBMC_VPD_VAL_LEN 512 +#define OPENBMC_VPD_KEY_LEN 64 +#define OPENBMC_VPD_VAL_LEN 512 struct ipmi_fru_field { - uint8_t type_length_field[IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX]; - /* store length of data stored in buffer */ - unsigned int type_length_field_length; + uint8_t type_length_field[IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX]; + /* store length of data stored in buffer */ + unsigned int type_length_field_length; }; typedef struct ipmi_fru_field ipmi_fru_field_t; @@ -108,622 +109,523 @@ typedef struct ipmi_fru_common_hdr uint8_t multirec; } __attribute__((packed)) ipmi_fru_common_hdr_t; -const char* vpd_key_names [] = -{ - "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,*/ +const char* vpd_key_names[] = { + "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,*/ }; - /* * -------------------------------------------------------------------- * * -------------------------------------------------------------------- */ -static size_t _to_time_str (uint32_t mfg_date_time, char* timestr, uint32_t len) +static size_t _to_time_str(uint32_t mfg_date_time, char* timestr, uint32_t len) { struct tm tm; time_t t; size_t s; - ASSERT (timestr); - ASSERT (len); + ASSERT(timestr); + ASSERT(len); - memset (&tm, '\0', sizeof (struct tm)); + memset(&tm, '\0', sizeof(struct tm)); t = mfg_date_time; - gmtime_r (&t, &tm); - s = strftime (timestr, len, "%F - %H:%M:%S", &tm); + gmtime_r(&t, &tm); + s = strftime(timestr, len, "%F - %H:%M:%S", &tm); return s; } /* private method to parse type/length */ -static int -_parse_type_length (const void *areabuf, - unsigned int areabuflen, - unsigned int current_area_offset, - uint8_t *number_of_data_bytes, - ipmi_fru_field_t *field) +static int _parse_type_length(const void* areabuf, unsigned int areabuflen, + unsigned int current_area_offset, + uint8_t* number_of_data_bytes, + ipmi_fru_field_t* field) { - const uint8_t *areabufptr = (const uint8_t*) areabuf; - uint8_t type_length; - uint8_t type_code; - - ASSERT (areabuf); - ASSERT (areabuflen); - ASSERT (number_of_data_bytes); - - type_length = areabufptr[current_area_offset]; - - /* ipmi workaround - * - * dell p weredge r610 - * - * my reading of the fru spec is that all non-custom fields are - * required to be listed by the vendor. however, on this - * motherboard, some areas list this, indicating that there is - * no more data to be parsed. so now, for "required" fields, i - * check to see if the type-length field is a sentinel before - * calling this function. - */ - - ASSERT (type_length != IPMI_FRU_SENTINEL_VALUE); - - type_code = (type_length & IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK) >> IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT; - (*number_of_data_bytes) = type_length & IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK; - - /* special case: this shouldn't be a length of 0x01 (see type/length - * byte format in fru information storage definition). - */ - if (type_code == IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE - && (*number_of_data_bytes) == 0x01) + const uint8_t* areabufptr = (const uint8_t*)areabuf; + uint8_t type_length; + uint8_t type_code; + + ASSERT(areabuf); + ASSERT(areabuflen); + ASSERT(number_of_data_bytes); + + type_length = areabufptr[current_area_offset]; + + /* ipmi workaround + * + * dell p weredge r610 + * + * my reading of the fru spec is that all non-custom fields are + * required to be listed by the vendor. however, on this + * motherboard, some areas list this, indicating that there is + * no more data to be parsed. so now, for "required" fields, i + * check to see if the type-length field is a sentinel before + * calling this function. + */ + + ASSERT(type_length != IPMI_FRU_SENTINEL_VALUE); + + type_code = (type_length & IPMI_FRU_TYPE_LENGTH_TYPE_CODE_MASK) >> + IPMI_FRU_TYPE_LENGTH_TYPE_CODE_SHIFT; + (*number_of_data_bytes) = + type_length & IPMI_FRU_TYPE_LENGTH_NUMBER_OF_DATA_BYTES_MASK; + + /* special case: this shouldn't be a length of 0x01 (see type/length + * byte format in fru information storage definition). + */ + if (type_code == IPMI_FRU_TYPE_LENGTH_TYPE_CODE_LANGUAGE_CODE && + (*number_of_data_bytes) == 0x01) { - return (-1); + return (-1); } - if ((current_area_offset + 1 + (*number_of_data_bytes)) > areabuflen) + if ((current_area_offset + 1 + (*number_of_data_bytes)) > areabuflen) { - return (-1); + return (-1); } - if (field) + if (field) { - memset (field->type_length_field, - '\0', - IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX); - memcpy (field->type_length_field, - &areabufptr[current_area_offset], - 1 + (*number_of_data_bytes)); - field->type_length_field_length = 1 + (*number_of_data_bytes); + memset(field->type_length_field, '\0', + IPMI_FRU_AREA_TYPE_LENGTH_FIELD_MAX); + memcpy(field->type_length_field, &areabufptr[current_area_offset], + 1 + (*number_of_data_bytes)); + field->type_length_field_length = 1 + (*number_of_data_bytes); } - return (0); + return (0); } -int -ipmi_fru_chassis_info_area (const void *areabuf, - unsigned int areabuflen, - uint8_t *chassis_type, - ipmi_fru_field_t *chassis_part_number, - ipmi_fru_field_t *chassis_serial_number, - ipmi_fru_field_t *chassis_custom_fields, - unsigned int chassis_custom_fields_len) +int ipmi_fru_chassis_info_area(const void* areabuf, unsigned int areabuflen, + uint8_t* chassis_type, + ipmi_fru_field_t* chassis_part_number, + ipmi_fru_field_t* chassis_serial_number, + ipmi_fru_field_t* chassis_custom_fields, + unsigned int chassis_custom_fields_len) { - const uint8_t *areabufptr = (const uint8_t*) areabuf; - unsigned int area_offset = 0; - unsigned int custom_fields_index = 0; - uint8_t number_of_data_bytes; - int rv = -1; + const uint8_t* areabufptr = (const uint8_t*)areabuf; + unsigned int area_offset = 0; + unsigned int custom_fields_index = 0; + uint8_t number_of_data_bytes; + int rv = -1; - if (!areabuf || !areabuflen) + if (!areabuf || !areabuflen) { - return (-1); + return (-1); } - if (chassis_part_number) - memset (chassis_part_number, - '\0', - sizeof (ipmi_fru_field_t)); - if (chassis_serial_number) - memset (chassis_serial_number, - '\0', - sizeof (ipmi_fru_field_t)); - if (chassis_custom_fields && chassis_custom_fields_len) - memset (chassis_custom_fields, - '\0', - sizeof (ipmi_fru_field_t) * chassis_custom_fields_len); - - if (chassis_type) - (*chassis_type) = areabufptr[area_offset]; - area_offset++; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - chassis_part_number) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - chassis_serial_number) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - while (area_offset < areabuflen - && areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE) + if (chassis_part_number) + memset(chassis_part_number, '\0', sizeof(ipmi_fru_field_t)); + if (chassis_serial_number) + memset(chassis_serial_number, '\0', sizeof(ipmi_fru_field_t)); + if (chassis_custom_fields && chassis_custom_fields_len) + memset(chassis_custom_fields, '\0', + sizeof(ipmi_fru_field_t) * chassis_custom_fields_len); + + if (chassis_type) + (*chassis_type) = areabufptr[area_offset]; + area_offset++; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, chassis_part_number) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, chassis_serial_number) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + while (area_offset < areabuflen && + areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE) { - ipmi_fru_field_t *field_ptr = NULL; + ipmi_fru_field_t* field_ptr = NULL; - if (chassis_custom_fields && chassis_custom_fields_len) + if (chassis_custom_fields && chassis_custom_fields_len) { - if (custom_fields_index < chassis_custom_fields_len) - field_ptr = &chassis_custom_fields[custom_fields_index]; - else + if (custom_fields_index < chassis_custom_fields_len) + field_ptr = &chassis_custom_fields[custom_fields_index]; + else { - goto cleanup; + goto cleanup; } } - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - field_ptr) < 0) - goto cleanup; + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, field_ptr) < 0) + goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - custom_fields_index++; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + custom_fields_index++; } - - out: - rv = 0; - cleanup: - return (rv); +out: + rv = 0; +cleanup: + return (rv); } -int -ipmi_fru_board_info_area (const void *areabuf, - unsigned int areabuflen, - uint8_t *language_code, - uint32_t *mfg_date_time, - ipmi_fru_field_t *board_manufacturer, - ipmi_fru_field_t *board_product_name, - ipmi_fru_field_t *board_serial_number, - ipmi_fru_field_t *board_part_number, - ipmi_fru_field_t *board_fru_file_id, - ipmi_fru_field_t *board_custom_fields, - unsigned int board_custom_fields_len) +int ipmi_fru_board_info_area( + const void* areabuf, unsigned int areabuflen, uint8_t* language_code, + uint32_t* mfg_date_time, ipmi_fru_field_t* board_manufacturer, + ipmi_fru_field_t* board_product_name, ipmi_fru_field_t* board_serial_number, + ipmi_fru_field_t* board_part_number, ipmi_fru_field_t* board_fru_file_id, + ipmi_fru_field_t* board_custom_fields, unsigned int board_custom_fields_len) { - const uint8_t *areabufptr = (const uint8_t*) areabuf; - uint32_t mfg_date_time_tmp = 0; - unsigned int area_offset = 0; - unsigned int custom_fields_index = 0; - uint8_t number_of_data_bytes; - int rv = -1; - - if (!areabuf || !areabuflen) + const uint8_t* areabufptr = (const uint8_t*)areabuf; + uint32_t mfg_date_time_tmp = 0; + unsigned int area_offset = 0; + unsigned int custom_fields_index = 0; + uint8_t number_of_data_bytes; + int rv = -1; + + if (!areabuf || !areabuflen) { - return (-1); + return (-1); } - if (board_manufacturer) - memset (board_manufacturer, - '\0', - sizeof (ipmi_fru_field_t)); - if (board_product_name) - memset (board_product_name, - '\0', - sizeof (ipmi_fru_field_t)); - if (board_serial_number) - memset (board_serial_number, - '\0', - sizeof (ipmi_fru_field_t)); - if (board_part_number) - memset (board_part_number, - '\0', - sizeof (ipmi_fru_field_t)); - if (board_fru_file_id) - memset (board_fru_file_id, - '\0', - sizeof (ipmi_fru_field_t)); - if (board_custom_fields && board_custom_fields_len) - memset (board_custom_fields, - '\0', - sizeof (ipmi_fru_field_t) * board_custom_fields_len); - - if (language_code) - (*language_code) = areabufptr[area_offset]; - area_offset++; - - if (mfg_date_time) + if (board_manufacturer) + memset(board_manufacturer, '\0', sizeof(ipmi_fru_field_t)); + if (board_product_name) + memset(board_product_name, '\0', sizeof(ipmi_fru_field_t)); + if (board_serial_number) + memset(board_serial_number, '\0', sizeof(ipmi_fru_field_t)); + if (board_part_number) + memset(board_part_number, '\0', sizeof(ipmi_fru_field_t)); + if (board_fru_file_id) + memset(board_fru_file_id, '\0', sizeof(ipmi_fru_field_t)); + if (board_custom_fields && board_custom_fields_len) + memset(board_custom_fields, '\0', + sizeof(ipmi_fru_field_t) * board_custom_fields_len); + + if (language_code) + (*language_code) = areabufptr[area_offset]; + area_offset++; + + if (mfg_date_time) { - struct tm tm; - time_t t; - - /* mfg_date_time is little endian - see spec */ - mfg_date_time_tmp |= areabufptr[area_offset]; - area_offset++; - mfg_date_time_tmp |= (areabufptr[area_offset] << 8); - 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; - - /* posix says individual calls need not clear/set all portions of - * 'struct tm', thus passing 'struct tm' between functions could - * have issues. so we need to memset. - */ - memset (&tm, '\0', sizeof(struct tm)); - - /* in fru, epoch is 0:00 hrs 1/1/96 - * - * so convert into ansi epoch - */ - - tm.tm_year = 96; /* years since 1900 */ - tm.tm_mon = 0; /* months since january */ - tm.tm_mday = 1; /* 1-31 */ - tm.tm_hour = 0; - tm.tm_min = 0; - tm.tm_sec = 0; - tm.tm_isdst = -1; - - if ((t = mktime (&tm)) == (time_t)-1) + struct tm tm; + time_t t; + + /* mfg_date_time is little endian - see spec */ + mfg_date_time_tmp |= areabufptr[area_offset]; + area_offset++; + mfg_date_time_tmp |= (areabufptr[area_offset] << 8); + 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; + + /* posix says individual calls need not clear/set all portions of + * 'struct tm', thus passing 'struct tm' between functions could + * have issues. so we need to memset. + */ + memset(&tm, '\0', sizeof(struct tm)); + + /* in fru, epoch is 0:00 hrs 1/1/96 + * + * so convert into ansi epoch + */ + + tm.tm_year = 96; /* years since 1900 */ + tm.tm_mon = 0; /* months since january */ + tm.tm_mday = 1; /* 1-31 */ + tm.tm_hour = 0; + tm.tm_min = 0; + tm.tm_sec = 0; + tm.tm_isdst = -1; + + if ((t = mktime(&tm)) == (time_t)-1) { - goto cleanup; + goto cleanup; } - mfg_date_time_tmp += (uint32_t)t; - (*mfg_date_time) = mfg_date_time_tmp; + mfg_date_time_tmp += (uint32_t)t; + (*mfg_date_time) = mfg_date_time_tmp; } - else - area_offset += 3; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - board_manufacturer) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - board_product_name) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - board_serial_number) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - board_part_number) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - board_fru_file_id) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - while (area_offset < areabuflen - && areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE) + else + area_offset += 3; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, board_manufacturer) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, board_product_name) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, board_serial_number) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, board_part_number) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, board_fru_file_id) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + while (area_offset < areabuflen && + areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE) { - ipmi_fru_field_t *field_ptr = NULL; + ipmi_fru_field_t* field_ptr = NULL; - if (board_custom_fields && board_custom_fields_len) + if (board_custom_fields && board_custom_fields_len) { - if (custom_fields_index < board_custom_fields_len) - field_ptr = &board_custom_fields[custom_fields_index]; - else + if (custom_fields_index < board_custom_fields_len) + field_ptr = &board_custom_fields[custom_fields_index]; + else { - goto cleanup; + goto cleanup; } } - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - field_ptr) < 0) - goto cleanup; + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, field_ptr) < 0) + goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - custom_fields_index++; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + custom_fields_index++; } - out: - rv = 0; - cleanup: - return (rv); +out: + rv = 0; +cleanup: + return (rv); } -int -ipmi_fru_product_info_area (const void *areabuf, - unsigned int areabuflen, - uint8_t *language_code, - ipmi_fru_field_t *product_manufacturer_name, - ipmi_fru_field_t *product_name, - ipmi_fru_field_t *product_part_model_number, - ipmi_fru_field_t *product_version, - ipmi_fru_field_t *product_serial_number, - ipmi_fru_field_t *product_asset_tag, - ipmi_fru_field_t *product_fru_file_id, - ipmi_fru_field_t *product_custom_fields, - unsigned int product_custom_fields_len) +int ipmi_fru_product_info_area( + const void* areabuf, unsigned int areabuflen, uint8_t* language_code, + ipmi_fru_field_t* product_manufacturer_name, ipmi_fru_field_t* product_name, + ipmi_fru_field_t* product_part_model_number, + ipmi_fru_field_t* product_version, ipmi_fru_field_t* product_serial_number, + ipmi_fru_field_t* product_asset_tag, ipmi_fru_field_t* product_fru_file_id, + ipmi_fru_field_t* product_custom_fields, + unsigned int product_custom_fields_len) { - const uint8_t *areabufptr = (const uint8_t*) areabuf; - unsigned int area_offset = 0; - unsigned int custom_fields_index = 0; - uint8_t number_of_data_bytes; - int rv = -1; + const uint8_t* areabufptr = (const uint8_t*)areabuf; + unsigned int area_offset = 0; + unsigned int custom_fields_index = 0; + uint8_t number_of_data_bytes; + int rv = -1; - if (!areabuf || !areabuflen) + if (!areabuf || !areabuflen) { - return (-1); + return (-1); } - if (product_manufacturer_name) - memset (product_manufacturer_name, - '\0', - sizeof (ipmi_fru_field_t)); - if (product_name) - memset (product_name, - '\0', - sizeof (ipmi_fru_field_t)); - if (product_part_model_number) - memset (product_part_model_number, - '\0', - sizeof (ipmi_fru_field_t)); - if (product_version) - memset (product_version, - '\0', - sizeof (ipmi_fru_field_t)); - if (product_serial_number) - memset (product_serial_number, - '\0', - sizeof (ipmi_fru_field_t)); - if (product_asset_tag) - memset (product_asset_tag, - '\0', - sizeof (ipmi_fru_field_t)); - if (product_fru_file_id) - memset (product_fru_file_id, - '\0', - sizeof (ipmi_fru_field_t)); - if (product_custom_fields && product_custom_fields_len) - memset (product_custom_fields, - '\0', - sizeof (ipmi_fru_field_t) * product_custom_fields_len); - - if (language_code) - (*language_code) = areabufptr[area_offset]; - area_offset++; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - product_manufacturer_name) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - product_name) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - product_part_model_number) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - product_version) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - product_serial_number) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - product_asset_tag) < 0) - goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) - goto out; - - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - product_fru_file_id) < 0) - goto cleanup; - - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - - while (area_offset < areabuflen - && areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE) + if (product_manufacturer_name) + memset(product_manufacturer_name, '\0', sizeof(ipmi_fru_field_t)); + if (product_name) + memset(product_name, '\0', sizeof(ipmi_fru_field_t)); + if (product_part_model_number) + memset(product_part_model_number, '\0', sizeof(ipmi_fru_field_t)); + if (product_version) + memset(product_version, '\0', sizeof(ipmi_fru_field_t)); + if (product_serial_number) + memset(product_serial_number, '\0', sizeof(ipmi_fru_field_t)); + if (product_asset_tag) + memset(product_asset_tag, '\0', sizeof(ipmi_fru_field_t)); + if (product_fru_file_id) + memset(product_fru_file_id, '\0', sizeof(ipmi_fru_field_t)); + if (product_custom_fields && product_custom_fields_len) + memset(product_custom_fields, '\0', + sizeof(ipmi_fru_field_t) * product_custom_fields_len); + + if (language_code) + (*language_code) = areabufptr[area_offset]; + area_offset++; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, + product_manufacturer_name) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, product_name) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, + product_part_model_number) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, product_version) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, product_serial_number) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, product_asset_tag) < 0) + goto cleanup; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + if (areabufptr[area_offset] == IPMI_FRU_SENTINEL_VALUE) + goto out; + + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, product_fru_file_id) < 0) + goto cleanup; + + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + + while (area_offset < areabuflen && + areabufptr[area_offset] != IPMI_FRU_SENTINEL_VALUE) { - ipmi_fru_field_t *field_ptr = NULL; + ipmi_fru_field_t* field_ptr = NULL; - if (product_custom_fields && product_custom_fields_len) + if (product_custom_fields && product_custom_fields_len) { - if (custom_fields_index < product_custom_fields_len) - field_ptr = &product_custom_fields[custom_fields_index]; - else + if (custom_fields_index < product_custom_fields_len) + field_ptr = &product_custom_fields[custom_fields_index]; + else { - goto cleanup; + goto cleanup; } } - if (_parse_type_length (areabufptr, - areabuflen, - area_offset, - &number_of_data_bytes, - field_ptr) < 0) - goto cleanup; + if (_parse_type_length(areabufptr, areabuflen, area_offset, + &number_of_data_bytes, field_ptr) < 0) + goto cleanup; - area_offset += 1; /* type/length byte */ - area_offset += number_of_data_bytes; - custom_fields_index++; + area_offset += 1; /* type/length byte */ + area_offset += number_of_data_bytes; + custom_fields_index++; } - - out: - rv = 0; - cleanup: - return (rv); +out: + rv = 0; +cleanup: + return (rv); } -void _append_to_dict (uint8_t vpd_key_id, - uint8_t* vpd_key_val, - IPMIFruInfo& info) +void _append_to_dict(uint8_t vpd_key_id, uint8_t* vpd_key_val, + IPMIFruInfo& info) { 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; + int sdr = 0; /* Needed to convert each uint8_t byte to a ascii */ char bin_byte[3] = {0}; @@ -735,12 +637,12 @@ void _append_to_dict (uint8_t vpd_key_id, char bin_in_ascii_len = vpd_val_len * 2 + 3; /* Binary converted to ascii in array */ - char *bin_in_ascii = (char *)malloc(bin_in_ascii_len); + char* bin_in_ascii = (char*)malloc(bin_in_ascii_len); /* For reading byte from the area */ int val = 0; - char *bin_copy = &((char *)bin_in_ascii)[2]; + char* bin_copy = &((char*)bin_in_ascii)[2]; switch (type_code) { @@ -748,7 +650,7 @@ void _append_to_dict (uint8_t vpd_key_id, memset(bin_in_ascii, 0x0, bin_in_ascii_len); /* Offset 1 is where actual data starts */ - for(val = 1; val <= vpd_val_len ; val++) + for (val = 1; val <= vpd_val_len; val++) { /* 2 bytes for data and 1 for terminating '\0' */ snprintf(bin_byte, 3, "%02x", vpd_key_val[val]); @@ -758,174 +660,168 @@ void _append_to_dict (uint8_t vpd_key_id, } /* We need the data represented as 0x...... */ - if(vpd_val_len > 0) + if (vpd_val_len > 0) { strncpy(bin_in_ascii, "0x", 2); } #if IPMI_FRU_PARSER_DEBUG - printf ("_append_to_dict: VPD Key = [%s] : Type Code = [BINARY] :" - " Len = [%d] : Val = [%s]\n", - vpd_key_names [vpd_key_id], vpd_val_len, bin_in_ascii); + printf("_append_to_dict: VPD Key = [%s] : Type Code = [BINARY] :" + " Len = [%d] : Val = [%s]\n", + vpd_key_names[vpd_key_id], vpd_val_len, bin_in_ascii); #endif - info[vpd_key_id] = std::make_pair(vpd_key_names[vpd_key_id], - bin_in_ascii); + info[vpd_key_id] = + std::make_pair(vpd_key_names[vpd_key_id], bin_in_ascii); break; case 3: #if IPMI_FRU_PARSER_DEBUG - 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]); + 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]); #endif info[vpd_key_id] = std::make_pair( - vpd_key_names[vpd_key_id], - std::string(vpd_key_val + 1, - vpd_key_val + 1 + type_length)); + vpd_key_names[vpd_key_id], + std::string(vpd_key_val + 1, vpd_key_val + 1 + type_length)); break; } - if(bin_in_ascii) + if (bin_in_ascii) { free(bin_in_ascii); bin_in_ascii = NULL; } - 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]); + printf( + "_append_to_dict : sd_bus_message_append Failed [ %d ] for [%s]\n", + sdr, vpd_key_names[vpd_key_id]); #endif } } -int parse_fru_area (const uint8_t area, const void* msgbuf, - const size_t len, IPMIFruInfo& info) +int parse_fru_area(const uint8_t area, const void* msgbuf, const size_t len, + IPMIFruInfo& info) { - int rv = -1; - int i = 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); - - 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: + int rv = -1; + int i = 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); + + 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: #if IPMI_FRU_PARSER_DEBUG - printf ("Chassis : Buf len = [%d]\n", len); + 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], - &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) + 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], + &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) + { #if IPMI_FRU_PARSER_DEBUG - printf ("Chassis : Appending [%s] = [%d]\n", - vpd_key_names[i], chassis_type); + printf("Chassis : Appending [%s] = [%d]\n", + vpd_key_names[i], chassis_type); #endif - info[i] = std::make_pair(vpd_key_names[i], - std::to_string(chassis_type)); - continue; + info[i] = std::make_pair(vpd_key_names[i], + std::to_string(chassis_type)); + continue; + } + _append_to_dict(i, vpd_info[i].type_length_field, info); } - _append_to_dict (i, vpd_info[i].type_length_field, info); - } - break; - case IPMI_FRU_AREA_BOARD_INFO: + break; + case IPMI_FRU_AREA_BOARD_INFO: #if IPMI_FRU_PARSER_DEBUG - printf ("Board : Buf len = [%d]\n", len); + printf("Board : Buf len = [%d]\n", len); #endif - ipmi_fru_board_info_area ((uint8_t*)msgbuf+2, - len, - NULL, - &mfg_date_time, - &vpd_info [OPENBMC_VPD_KEY_BOARD_MFR], - &vpd_info [OPENBMC_VPD_KEY_BOARD_NAME], - &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], - &vpd_info [OPENBMC_VPD_KEY_BOARD_CUSTOM1], + ipmi_fru_board_info_area( + (uint8_t*)msgbuf + 2, len, NULL, &mfg_date_time, + &vpd_info[OPENBMC_VPD_KEY_BOARD_MFR], + &vpd_info[OPENBMC_VPD_KEY_BOARD_NAME], + &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], + &vpd_info[OPENBMC_VPD_KEY_BOARD_CUSTOM1], OPENBMC_VPD_KEY_CUSTOM_FIELDS_MAX); - /* Populate VPD Table */ - for (i=OPENBMC_VPD_KEY_BOARD_MFG_DATE; - i<=OPENBMC_VPD_KEY_BOARD_MAX; i++) + /* Populate VPD Table */ + for (i = OPENBMC_VPD_KEY_BOARD_MFG_DATE; + i <= OPENBMC_VPD_KEY_BOARD_MAX; i++) { - if (i==OPENBMC_VPD_KEY_BOARD_MFG_DATE) + if (i == OPENBMC_VPD_KEY_BOARD_MFG_DATE) { - _to_time_str (mfg_date_time, timestr, OPENBMC_VPD_VAL_LEN); + _to_time_str(mfg_date_time, timestr, OPENBMC_VPD_VAL_LEN); #if IPMI_FRU_PARSER_DEBUG - printf ("Board : Appending [%s] = [%s]\n", - vpd_key_names[i], timestr); + printf("Board : Appending [%s] = [%s]\n", vpd_key_names[i], + timestr); #endif - info[i] = std::make_pair(vpd_key_names[i], - std::string(timestr)); + info[i] = + std::make_pair(vpd_key_names[i], std::string(timestr)); continue; } - _append_to_dict (i, vpd_info[i].type_length_field, info); - + _append_to_dict(i, vpd_info[i].type_length_field, info); } break; - case IPMI_FRU_AREA_PRODUCT_INFO: + case IPMI_FRU_AREA_PRODUCT_INFO: #if IPMI_FRU_PARSER_DEBUG - printf ("Product : Buf len = [%d]\n", len); + 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], - &vpd_info [OPENBMC_VPD_KEY_PRODUCT_NAME], - &vpd_info [OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM], - &vpd_info [OPENBMC_VPD_KEY_PRODUCT_VER], - &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], - &vpd_info [OPENBMC_VPD_KEY_PRODUCT_CUSTOM1], + ipmi_fru_product_info_area( + (uint8_t*)msgbuf + 2, len, NULL, + &vpd_info[OPENBMC_VPD_KEY_PRODUCT_MFR], + &vpd_info[OPENBMC_VPD_KEY_PRODUCT_NAME], + &vpd_info[OPENBMC_VPD_KEY_PRODUCT_PART_MODEL_NUM], + &vpd_info[OPENBMC_VPD_KEY_PRODUCT_VER], + &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], + &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) + for (i = OPENBMC_VPD_KEY_PRODUCT_MFR; + i <= OPENBMC_VPD_KEY_PRODUCT_MAX; ++i) { - _append_to_dict (i, vpd_info[i].type_length_field, info); + _append_to_dict(i, vpd_info[i].type_length_field, info); } break; - default: - /* TODO: Parse Multi Rec / Internal use area */ - break; - } + default: + /* TODO: Parse Multi Rec / Internal use area */ + break; + } #if IPMI_FRU_PARSER_DEBUG - printf ("parse_fru_area : Dictionary Packing Complete\n"); + printf("parse_fru_area : Dictionary Packing Complete\n"); #endif - rv = 0; - return (rv); + rv = 0; + return (rv); } |