summaryrefslogtreecommitdiffstats
path: root/lib/pb-protocol/pb-protocol.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pb-protocol/pb-protocol.c')
-rw-r--r--lib/pb-protocol/pb-protocol.c70
1 files changed, 46 insertions, 24 deletions
diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c
index 33bd4e6..aff1946 100644
--- a/lib/pb-protocol/pb-protocol.c
+++ b/lib/pb-protocol/pb-protocol.c
@@ -99,13 +99,17 @@ int pb_protocol_serialise_string(char *pos, const char *str)
{
int len = 0;
+ if (!pos)
+ return 0;
+
if (str)
len = strlen(str);
*(uint32_t *)pos = __cpu_to_be32(len);
pos += sizeof(uint32_t);
- memcpy(pos, str, len);
+ if (str)
+ memcpy(pos, str, len);
return len + sizeof(uint32_t);
}
@@ -249,6 +253,9 @@ int pb_protocol_system_info_len(const struct system_info *sysinfo)
for (i = 0; i < sysinfo->n_bmc_golden; i++)
len += 4 + optional_strlen(sysinfo->bmc_golden[i]);
+ /* BMC MAC */
+ len += HWADDR_SIZE;
+
for (i = 0; i < sysinfo->n_interfaces; i++) {
struct interface_info *if_info = sysinfo->interfaces[i];
len += 4 + if_info->hwaddr_size +
@@ -265,8 +272,8 @@ int pb_protocol_system_info_len(const struct system_info *sysinfo)
4 + optional_strlen(bd_info->mountpoint);
}
- /* BMC MAC */
- len += HWADDR_SIZE;
+ /* stb info */
+ len += 3 * sizeof(bool);
return len;
}
@@ -337,6 +344,8 @@ int pb_protocol_config_len(const struct config *config)
len += 4 + optional_strlen(config->lang);
+ len += 4; /* preboot check */
+
return len;
}
@@ -417,9 +426,8 @@ int pb_protocol_serialise_device(const struct device *dev,
pos += pb_protocol_serialise_string(pos, dev->icon_file);
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_boot_option(const struct boot_option *opt,
@@ -447,9 +455,8 @@ int pb_protocol_serialise_boot_option(const struct boot_option *opt,
pos += 4;
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_boot_command(const struct boot_command *boot,
@@ -466,9 +473,8 @@ int pb_protocol_serialise_boot_command(const struct boot_command *boot,
pos += pb_protocol_serialise_string(pos, boot->console);
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_boot_status(const struct status *status,
@@ -488,9 +494,8 @@ int pb_protocol_serialise_boot_status(const struct status *status,
pos += sizeof(bool);
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_system_info(const struct system_info *sysinfo,
@@ -560,10 +565,16 @@ int pb_protocol_serialise_system_info(const struct system_info *sysinfo,
memset(pos, 0, HWADDR_SIZE);
pos += HWADDR_SIZE;
+ *(bool *)pos = sysinfo->stb_fw_measurement;
+ pos += sizeof(bool);
+ *(bool *)pos = sysinfo->stb_fw_enforcing;
+ pos += sizeof(bool);
+ *(bool *)pos = sysinfo->stb_os_enforcing;
+ pos += sizeof(bool);
+
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
static int pb_protocol_serialise_config_interface(char *buf,
@@ -668,10 +679,12 @@ int pb_protocol_serialise_config(const struct config *config,
pos += pb_protocol_serialise_string(pos, config->lang);
+ *(uint32_t *)pos = config->preboot_check_enabled;
+ pos += 4;
+
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_url(const char *url, char *buf, int buf_len)
@@ -681,9 +694,8 @@ int pb_protocol_serialise_url(const char *url, char *buf, int buf_len)
pos += pb_protocol_serialise_string(pos, url);
assert(pos <=buf+buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_plugin_option(const struct plugin_option *opt,
@@ -707,9 +719,8 @@ int pb_protocol_serialise_plugin_option(const struct plugin_option *opt,
pos += pb_protocol_serialise_string(pos, opt->executables[i]);
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_temp_autoboot(const struct autoboot_option *opt,
@@ -727,9 +738,9 @@ int pb_protocol_serialise_temp_autoboot(const struct autoboot_option *opt,
pos += pb_protocol_serialise_string(pos, opt->uuid);
}
- (void)buf_len;
+ assert(pos <= buf + buf_len);
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_serialise_authenticate(struct auth_message *msg,
@@ -766,9 +777,8 @@ int pb_protocol_serialise_authenticate(struct auth_message *msg,
};
assert(pos <= buf + buf_len);
- (void)buf_len;
- return 0;
+ return (pos <= buf + buf_len) ? 0 : -1;
}
int pb_protocol_write_message(int fd, struct pb_protocol_message *message)
@@ -948,7 +958,7 @@ int pb_protocol_deserialise_boot_option(struct boot_option *opt,
if (read_u32(&pos, &len, &opt->type))
return -1;
- rc = 0;
+ rc = (pos <= message->payload + message->payload_len) ? 0 : -1;
out:
return rc;
@@ -1165,6 +1175,14 @@ int pb_protocol_deserialise_system_info(struct system_info *sysinfo,
pos += HWADDR_SIZE;
len -= HWADDR_SIZE;
+ sysinfo->stb_fw_measurement = !!*pos;
+ pos += sizeof(bool);
+ sysinfo->stb_fw_enforcing = !!*pos;
+ pos += sizeof(bool);
+ sysinfo->stb_os_enforcing = !!*pos;
+ pos += sizeof(bool);
+ len -= 3 * sizeof(bool);
+
rc = 0;
out:
return rc;
@@ -1322,6 +1340,10 @@ int pb_protocol_deserialise_config(struct config *config,
config->lang = str;
+ if (read_u32(&pos, &len, &tmp))
+ goto out;
+ config->preboot_check_enabled = !!tmp;
+
rc = 0;
out:
OpenPOWER on IntegriCloud