diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2018-07-03 16:34:43 +1000 |
---|---|---|
committer | Samuel Mendoza-Jonas <sam@mendozajonas.com> | 2018-07-10 13:00:53 +1000 |
commit | 6598baa0bd34db9a9c446500a940ec034375b523 (patch) | |
tree | b33665d59c6925a94babada8db3da46cb147bef2 /lib/pb-protocol | |
parent | 6fa0edfb029726968cbacad9d4e193a345956ff3 (diff) | |
download | talos-petitboot-6598baa0bd34db9a9c446500a940ec034375b523.tar.gz talos-petitboot-6598baa0bd34db9a9c446500a940ec034375b523.zip |
protocol: Add definition and serialisation for temporary autoboot
Add a new message format for a temporarily-applied autoboot setting.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
Diffstat (limited to 'lib/pb-protocol')
-rw-r--r-- | lib/pb-protocol/pb-protocol.c | 70 | ||||
-rw-r--r-- | lib/pb-protocol/pb-protocol.h | 6 |
2 files changed, 76 insertions, 0 deletions
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 */ |