#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;
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);
config->ipmi_bootdev = bootdev;
config->ipmi_bootdev_persistent = persistent;
- switch (bootdev) {
- case IPMI_BOOTDEV_NONE:
- case IPMI_BOOTDEV_DISK:
- case IPMI_BOOTDEV_NETWORK:
- case IPMI_BOOTDEV_CDROM:
- default:
- break;
- case IPMI_BOOTDEV_SETUP:
- config->autoboot_enabled = false;
- break;
- case IPMI_BOOTDEV_SAFE:
- config->autoboot_enabled = false;
+ if (bootdev == IPMI_BOOTDEV_SAFE)
config->safe_mode = true;
- break;
- }
}
static int read_bootdev_sysparam(const char *name, uint8_t *val)
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",
rc = parse_nvram(platform);
if (rc)
- return rc;
+ pb_log("%s: Failed to parse nvram\n", __func__);
populate_config(platform, config);