From: Jeremy Kerr Date: Tue, 3 Jul 2018 06:34:43 +0000 (+1000) Subject: protocol: Add definition and serialisation for temporary autoboot X-Git-Tag: v1.9.0~65 X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=commitdiff_plain;h=6598baa0bd34db9a9c446500a940ec034375b523;ds=inline protocol: Add definition and serialisation for temporary autoboot Add a new message format for a temporarily-applied autoboot setting. Signed-off-by: Jeremy Kerr Signed-off-by: Samuel Mendoza-Jonas --- diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c index dbbda40..8e37348 100644 --- a/lib/pb-protocol/pb-protocol.c +++ b/lib/pb-protocol/pb-protocol.c @@ -363,6 +363,21 @@ int pb_protocol_plugin_option_len(const struct plugin_option *opt) return len; } +int pb_protocol_temp_autoboot_len(const struct autoboot_option *opt) +{ + unsigned int len = 0; + + /* boot_type */ + len += 4; + + if (opt->boot_type == BOOT_DEVICE_TYPE) + len += 4; + else + len += optional_strlen(opt->uuid); + + return len; +} + int pb_protocol_serialise_device(const struct device *dev, char *buf, int buf_len) { @@ -663,6 +678,26 @@ int pb_protocol_serialise_plugin_option(const struct plugin_option *opt, return 0; } +int pb_protocol_serialise_temp_autoboot(const struct autoboot_option *opt, + char *buf, int buf_len) +{ + char *pos = buf; + + *(uint32_t *)pos = __cpu_to_be32(opt->boot_type); + pos += 4; + + if (opt->boot_type == BOOT_DEVICE_TYPE) { + *(uint32_t *)pos = __cpu_to_be32(opt->type); + pos += 4; + } else { + pos += pb_protocol_serialise_string(pos, opt->uuid); + } + + (void)buf_len; + + return 0; +} + int pb_protocol_write_message(int fd, struct pb_protocol_message *message) { int total_len, rc; @@ -1265,3 +1300,38 @@ int pb_protocol_deserialise_plugin_option(struct plugin_option *opt, out: return rc; } + +int pb_protocol_deserialise_temp_autoboot(struct autoboot_option *opt, + const struct pb_protocol_message *message) +{ + unsigned int len, tmp; + const char *pos; + int rc = -1; + char *str; + + len = message->payload_len; + pos = message->payload; + + if (read_u32(&pos, &len, &tmp)) + goto out; + + opt->boot_type = tmp; + if (opt->boot_type == BOOT_DEVICE_TYPE) { + if (read_u32(&pos, &len, &tmp)) + goto out; + opt->type = tmp; + + } else if (opt->boot_type == BOOT_DEVICE_UUID) { + if (read_string(opt, &pos, &len, &str)) + goto out; + opt->uuid = str; + + } else { + return -1; + } + + rc = 0; + +out: + return rc; +} diff --git a/lib/pb-protocol/pb-protocol.h b/lib/pb-protocol/pb-protocol.h index 250c2d1..14fd8a2 100644 --- a/lib/pb-protocol/pb-protocol.h +++ b/lib/pb-protocol/pb-protocol.h @@ -26,6 +26,7 @@ enum pb_protocol_action { PB_PROTOCOL_ACTION_PLUGIN_OPTION_ADD = 0xc, PB_PROTOCOL_ACTION_PLUGINS_REMOVE = 0xd, PB_PROTOCOL_ACTION_PLUGIN_INSTALL = 0xe, + PB_PROTOCOL_ACTION_TEMP_AUTOBOOT = 0xf, }; struct pb_protocol_message { @@ -44,6 +45,7 @@ int pb_protocol_system_info_len(const struct system_info *sysinfo); int pb_protocol_config_len(const struct config *config); int pb_protocol_url_len(const char *url); int pb_protocol_plugin_option_len(const struct plugin_option *opt); +int pb_protocol_temp_autoboot_len(const struct autoboot_option *opt); int pb_protocol_device_cmp(const struct device *a, const struct device *b); int pb_protocol_boot_option_cmp(const struct boot_option *a, @@ -68,6 +70,8 @@ int pb_protocol_serialise_config(const struct config *config, int pb_protocol_serialise_url(const char *url, char *buf, int buf_len); int pb_protocol_serialise_plugin_option(const struct plugin_option *opt, char *buf, int buf_len); +int pb_protocol_serialise_temp_autoboot(const struct autoboot_option *opt, + char *buf, int buf_len); int pb_protocol_write_message(int fd, struct pb_protocol_message *message); @@ -96,4 +100,6 @@ int pb_protocol_deserialise_config(struct config *config, int pb_protocol_deserialise_plugin_option(struct plugin_option *opt, const struct pb_protocol_message *message); +int pb_protocol_deserialise_temp_autoboot(struct autoboot_option *opt, + const struct pb_protocol_message *message); #endif /* _PB_PROTOCOL_H */