X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=lib%2Fpb-protocol%2Fpb-protocol.c;h=41707da09ab0d7345c8d0a0a2d2f9d1b48f43517;hb=becf2b28d8b0aa561ac7e42db519071f8065d37f;hp=dbbda406fe5a022c518c656c4b44e11b692010da;hpb=9f191cc3c194ed51534c22e2dae15b2c08c8abc2;p=petitboot diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c index dbbda40..41707da 100644 --- a/lib/pb-protocol/pb-protocol.c +++ b/lib/pb-protocol/pb-protocol.c @@ -253,7 +253,8 @@ int pb_protocol_system_info_len(const struct system_info *sysinfo) len += 4 + if_info->hwaddr_size + 4 + optional_strlen(if_info->name) + sizeof(if_info->link) + - 4 + optional_strlen(if_info->address); + 4 + optional_strlen(if_info->address) + + 4 + optional_strlen(if_info->address_v6); } for (i = 0; i < sysinfo->n_blockdevs; i++) { @@ -363,6 +364,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) { @@ -494,6 +510,7 @@ int pb_protocol_serialise_system_info(const struct system_info *sysinfo, pos += sizeof(bool); pos += pb_protocol_serialise_string(pos, if_info->address); + pos += pb_protocol_serialise_string(pos, if_info->address_v6); } *(uint32_t *)pos = __cpu_to_be32(sysinfo->n_blockdevs); @@ -663,6 +680,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; @@ -1011,6 +1048,8 @@ int pb_protocol_deserialise_system_info(struct system_info *sysinfo, if (read_string(if_info, &pos, &len, &if_info->address)) goto out; + if (read_string(if_info, &pos, &len, &if_info->address_v6)) + goto out; sysinfo->interfaces[i] = if_info; } @@ -1265,3 +1304,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; +}