#include <stdlib.h>
#include <limits.h>
#include <errno.h>
+#include <fcntl.h>
#include <sys/types.h>
#include <sys/wait.h>
-#include <sys/fcntl.h>
#include <sys/stat.h>
#include <asm/byteorder.h>
#include <log/log.h>
#include <process/process.h>
#include <types/types.h>
+#include <url/url.h>
#include "hostboot.h"
#include "platform.h"
static const char *partition = "common";
static const char *sysparams_dir = "/sys/firmware/opal/sysparams/";
static const char *devtree_dir = "/proc/device-tree/";
-static const int ipmi_timeout = 5000; /* milliseconds. */
+static const int ipmi_timeout = 10000; /* milliseconds. */
struct param {
char *name;
static int parse_nvram(struct platform_powerpc *platform)
{
- struct process *process;
+ struct process_stdout *stdout;
const char *argv[5];
int rc;
argv[3] = partition;
argv[4] = NULL;
- process = process_create(platform);
- process->path = "nvram";
- process->argv = argv;
- process->keep_stdout = true;
-
- rc = process_run_sync(process);
+ rc = process_get_stdout_argv(NULL, &stdout, argv);
- if (rc || !process_exit_ok(process)) {
+ if (rc) {
fprintf(stderr, "nvram process returned "
"non-zero exit status\n");
rc = -1;
} else {
- rc = parse_nvram_params(platform, process->stdout_buf,
- process->stdout_len);
+ rc = parse_nvram_params(platform, stdout->buf, stdout->len);
}
- process_release(process);
+ talloc_free(stdout);
return rc;
}
char *confstr)
{
struct interface_config *ifconf;
- char *tok, *saveptr;
+ char *tok, *tok_gw, *tok_url, *saveptr;
ifconf = talloc_zero(config, struct interface_config);
ifconf->static_config.address =
talloc_strdup(ifconf, tok);
- tok = strtok_r(NULL, ",", &saveptr);
- if (tok) {
- ifconf->static_config.gateway =
- talloc_strdup(ifconf, tok);
+ /*
+ * If a url is set but not a gateway, we can accidentally
+ * interpret the url as the gateway. To avoid changing the
+ * parameter format check if the "gateway" is actually a
+ * pb-url if it's the last token.
+ */
+ tok_gw = strtok_r(NULL, ",", &saveptr);
+ tok_url = strtok_r(NULL, ",", &saveptr);
+
+ if (tok_gw) {
+ if (tok_url || !is_url(tok_gw))
+ ifconf->static_config.gateway =
+ talloc_strdup(ifconf, tok_gw);
+ else
+ tok_url = tok_gw;
}
- tok = strtok_r(NULL, ",", &saveptr);
- if (tok) {
+ if (tok_url)
ifconf->static_config.url =
- talloc_strdup(ifconf, tok);
- }
-
+ talloc_strdup(ifconf, tok_url);
} else {
pb_log("Unknown network configuration method %s\n", tok);
goto out_err;
config->n_autoboot_opts = n_new;
}
-static void set_proxy_variables(struct config *config)
-{
- if (config->http_proxy)
- setenv("http_proxy", config->http_proxy, 1);
- else
- unsetenv("http_proxy");
-
- if (config->https_proxy)
- setenv("https_proxy", config->https_proxy, 1);
- else
- unsetenv("https_proxy");
-}
-
static void populate_config(struct platform_powerpc *platform,
struct config *config)
{
val = get_param(platform, "petitboot,https_proxy");
if (val)
config->https_proxy = talloc_strdup(config, val);
- set_proxy_variables(config);
}
static char *iface_config_str(void *ctx, struct interface_config *config)
update_string_config(platform, "petitboot,http_proxy", val);
val = config->https_proxy ?: "";
update_string_config(platform, "petitboot,https_proxy", val);
- set_proxy_variables(config);
update_network_config(platform, config);
struct platform_powerpc *platform = p->platform_data;
uint16_t resp_len = 16;
uint8_t resp[16], bcd;
- uint32_t aux_version;
int i, rc;
/* Retrieve info from current side */
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;
resp[2]);
bcd = resp[4] & 0x0f;
bcd += 10 * (resp[4] >> 4);
- memcpy(&aux_version, &resp[12], sizeof(aux_version));
+ /* rev1.rev2.aux_revision */
info->bmc_current[2] = talloc_asprintf(info,
- "Firmware version: %u.%02u.%05u",
- resp[3], bcd, aux_version);
+ "Firmware version: %u.%02u",
+ resp[3], bcd);
+ if (resp_len == 16) {
+ info->bmc_current[2] = talloc_asprintf_append(
+ info->bmc_current[2],
+ ".%02x%02x%02x%02x",
+ 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",
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;
resp[2]);
bcd = resp[4] & 0x0f;
bcd += 10 * (resp[4] >> 4);
- memcpy(&aux_version, &resp[12], sizeof(aux_version));
+ /* rev1.rev2.aux_revision */
info->bmc_golden[2] = talloc_asprintf(info,
- "Firmware version: %u.%02u.%u",
- resp[3], bcd, aux_version);
+ "Firmware version: %u.%02u",
+ resp[3], bcd);
+ if (resp_len == 16) {
+ info->bmc_golden[2] = talloc_asprintf_append(
+ info->bmc_golden[2],
+ ".%02x%02x%02x%02x",
+ 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",
memcpy(&cookie, &resp[i], sizeof(cookie));
cookie = __be32_to_cpu(cookie);
if (cookie != magic_value) {
- pb_log("%s: Incorrect cookie %x\n", __func__, cookie);
+ pb_log_fn("Incorrect cookie %x\n", cookie);
return;
}
i += sizeof(cookie);
rc = parse_nvram(platform);
if (rc)
- return rc;
+ pb_log_fn("Failed to parse nvram\n");
populate_config(platform, config);