Re-work ipmi_mc_get_guid() and turn it into reusable code

This commit is contained in:
Zdenek Styblik 2016-05-11 06:54:39 +02:00
parent 244ce02f91
commit 5fca596492
2 changed files with 75 additions and 55 deletions

View File

@ -89,6 +89,25 @@ struct ipm_devid_rsp {
#define IPM_DEV_ADTL_SUPPORT_BITS (8) #define IPM_DEV_ADTL_SUPPORT_BITS (8)
/* Structure follow the IPMI V.2 Rev 1.0
* See Table 20-10 */
#ifdef HAVE_PRAGMA_PACK
#pragma pack(1)
#endif
struct ipmi_guid_t {
uint32_t time_low; /* timestamp low field */
uint16_t time_mid; /* timestamp middle field */
uint16_t time_hi_and_version; /* timestamp high field and version number */
uint8_t clock_seq_hi_variant;/* clock sequence high field and variant */
uint8_t clock_seq_low; /* clock sequence low field */
uint8_t node[6]; /* node */
} ATTRIBUTE_PACKING;
#ifdef HAVE_PRAGMA_PACK
#pragma pack(0)
#endif
int _ipmi_mc_get_guid(struct ipmi_intf *, struct ipmi_guid_t *);
#ifdef HAVE_PRAGMA_PACK #ifdef HAVE_PRAGMA_PACK
#pragma pack(1) #pragma pack(1)
#endif #endif

View File

@ -462,60 +462,52 @@ ipmi_mc_get_deviceid(struct ipmi_intf * intf)
return 0; return 0;
} }
/* Structure follow the IPMI V.2 Rev 1.0 /* _ipmi_mc_get_guid - Gets BMCs GUID according to (22.14)
* See Table 20-10 */
#ifdef HAVE_PRAGMA_PACK
#pragma pack(1)
#endif
struct ipmi_guid {
uint32_t time_low; /* timestamp low field */
uint16_t time_mid; /* timestamp middle field */
uint16_t time_hi_and_version; /* timestamp high field and version number */
uint8_t clock_seq_hi_variant;/* clock sequence high field and variant */
uint8_t clock_seq_low; /* clock sequence low field */
uint8_t node[6]; /* node */
} ATTRIBUTE_PACKING;
#ifdef HAVE_PRAGMA_PACK
#pragma pack(0)
#endif
/* ipmi_mc_get_guid - print this MC GUID
* *
* @intf: ipmi interface * @intf: ipmi interface
* @guid: pointer where to store BMC GUID
* *
* returns 0 on success * returns - negative number means error, positive is a ccode.
* returns -1 on error
*/ */
static int int
ipmi_mc_get_guid(struct ipmi_intf * intf) _ipmi_mc_get_guid(struct ipmi_intf *intf, struct ipmi_guid_t *guid)
{ {
struct ipmi_rs *rsp; struct ipmi_rs *rsp;
struct ipmi_rq req; struct ipmi_rq req;
struct ipmi_guid guid; if (guid == NULL) {
return (-3);
}
memset(guid, 0, sizeof(struct ipmi_guid_t));
memset(&req, 0, sizeof(req)); memset(&req, 0, sizeof(req));
req.msg.netfn = IPMI_NETFN_APP; req.msg.netfn = IPMI_NETFN_APP;
req.msg.cmd = BMC_GET_GUID; req.msg.cmd = BMC_GET_GUID;
rsp = intf->sendrecv(intf, &req); rsp = intf->sendrecv(intf, &req);
if (rsp == NULL) { if (rsp == NULL) {
lprintf(LOG_ERR, "Get GUID command failed"); return (-1);
return -1; } else if (rsp->ccode > 0) {
return rsp->ccode;
} else if (rsp->data_len != 16
|| rsp->data_len != sizeof(struct ipmi_guid_t)) {
return (-2);
} }
if (rsp->ccode > 0) { memcpy(guid, &rsp->data[0], sizeof(struct ipmi_guid_t));
lprintf(LOG_ERR, "Get GUID command failed: %s", return 0;
val2str(rsp->ccode, completion_code_vals));
return -1;
} }
if (rsp->data_len == sizeof(struct ipmi_guid)) { /* ipmi_mc_print_guid - print-out given BMC GUID
*
* @guid - struct with GUID.
*
* returns 0
*/
static int
ipmi_mc_print_guid(struct ipmi_guid_t guid)
{
char tbuf[40]; char tbuf[40];
time_t s; time_t s;
memset(tbuf, 0, 40); memset(tbuf, 0, 40);
memset(&guid, 0, sizeof(struct ipmi_guid));
memcpy(&guid, rsp->data, rsp->data_len);
/* Kipp - changed order of last field (node) to follow specification */ /* Kipp - changed order of last field (node) to follow specification */
printf("System GUID : %08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x\n", printf("System GUID : %08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x\n",
guid.time_low, guid.time_mid, guid.time_hi_and_version, guid.time_low, guid.time_mid, guid.time_hi_and_version,
@ -526,12 +518,21 @@ ipmi_mc_get_guid(struct ipmi_intf * intf)
s = (time_t)guid.time_low; /* Kipp - removed the BSWAP_32, it was not needed here */ s = (time_t)guid.time_low; /* Kipp - removed the BSWAP_32, it was not needed here */
strftime(tbuf, sizeof(tbuf), "%m/%d/%Y %H:%M:%S", localtime(&s)); strftime(tbuf, sizeof(tbuf), "%m/%d/%Y %H:%M:%S", localtime(&s));
printf("Timestamp : %s\n", tbuf); printf("Timestamp : %s\n", tbuf);
} return 0;
else {
lprintf(LOG_ERR, "Invalid GUID length %d", rsp->data_len);
} }
return 0; /* ipmi_mc_get_guid - Gets and prints-out System GUID */
int
ipmi_mc_get_guid(struct ipmi_intf *intf)
{
struct ipmi_guid_t guid;
int rc;
rc = _ipmi_mc_get_guid(intf, &guid);
if (eval_ccode(rc) != 0) {
return (-1);
}
rc = ipmi_mc_print_guid(guid);
return rc;
} }
/* ipmi_mc_get_selftest - returns and print selftest results /* ipmi_mc_get_selftest - returns and print selftest results