discover/platform-powerpc: Handle optional Get Device ID section
diff mbox

Message ID 20170614041107.22333-1-sam@mendozajonas.com
State Accepted
Headers show

Commit Message

Samuel Mendoza-Jonas June 14, 2017, 4:11 a.m. UTC
The 'auxiliary' section of the 'Get Device ID' response is optional,
and some platforms exclude it from the response entirely. However
Petitboot only recognises the response as valid if it includes the full
16 bytes.
Update get_ipmi_bmc_versions() to also handle responses of only 12 bytes.

Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
---
 discover/platform-powerpc.c | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

Patch
diff mbox

diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c
index c2e2233..1426078 100644
--- a/discover/platform-powerpc.c
+++ b/discover/platform-powerpc.c
@@ -1050,7 +1050,7 @@  static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
 		pb_debug("\n");
 	}
 
-	if (rc == 0 && resp_len == 16) {
+	if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
 		info->bmc_current = talloc_array(info, char *, 4);
 		info->n_bmc_current = 4;
 
@@ -1062,9 +1062,13 @@  static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
 		bcd += 10 * (resp[4] >> 4);
 		/* rev1.rev2.aux_revision */
 		info->bmc_current[2] = talloc_asprintf(info,
-						"Firmware version: %u.%02u.%x%x%x%x",
-						resp[3], bcd, resp[12],
-						resp[13], resp[14], resp[15]);
+				"Firmware version: %u.%02u",
+				resp[3], bcd);
+		if (resp_len == 16) {
+			info->bmc_current[2] = talloc_asprintf_append(
+					info->bmc_current[2], ".%x%x%x%x",
+					resp[12], resp[13], resp[14], resp[15]);
+		}
 		bcd = resp[5] & 0x0f;
 		bcd += 10 * (resp[5] >> 4);
 		info->bmc_current[3] = talloc_asprintf(info, "IPMI version: %u",
@@ -1089,7 +1093,7 @@  static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
 		pb_debug("\n");
 	}
 
-	if (rc == 0 && resp_len == 16) {
+	if (rc == 0 && (resp_len == 12 || resp_len == 16)) {
 		info->bmc_golden = talloc_array(info, char *, 4);
 		info->n_bmc_golden = 4;
 
@@ -1101,9 +1105,13 @@  static void get_ipmi_bmc_versions(struct platform *p, struct system_info *info)
 		bcd += 10 * (resp[4] >> 4);
 		/* rev1.rev2.aux_revision */
 		info->bmc_golden[2] = talloc_asprintf(info,
-						"Firmware version: %u.%02u.%x%x%x%x",
-						resp[3], bcd, resp[12],
-						resp[13], resp[14], resp[15]);
+				"Firmware version: %u.%02u",
+				resp[3], bcd);
+		if (resp_len == 16) {
+			info->bmc_golden[2] = talloc_asprintf_append(
+					info->bmc_golden[2], ".%x%x%x%x",
+					resp[12], resp[13], resp[14], resp[15]);
+		}
 		bcd = resp[5] & 0x0f;
 		bcd += 10 * (resp[5] >> 4);
 		info->bmc_golden[3] = talloc_asprintf(info, "IPMI version: %u",