[[RFC PATCH] v2 09/14] Retrieve IP address of BMC
Samuel Mendoza-Jonas
sam at mendozajonas.com
Thu Jan 18 16:05:12 AEDT 2018
Signed-off-by: Samuel Mendoza-Jonas <sam at mendozajonas.com>
---
discover/platform-powerpc.c | 27 ++++++++++++++++++++++++++-
lib/pb-protocol/pb-protocol.c | 7 +++++++
lib/types/types.h | 1 +
ui/ncurses/nc-sysinfo.c | 3 +++
4 files changed, 37 insertions(+), 1 deletion(-)
diff --git a/discover/platform-powerpc.c b/discover/platform-powerpc.c
index 2478a00..df95e02 100644
--- a/discover/platform-powerpc.c
+++ b/discover/platform-powerpc.c
@@ -983,6 +983,29 @@ static int set_ipmi_os_boot_sensor(struct platform_powerpc *platform)
return 0;
}
+static void get_ipmi_bmc_ip(struct platform *p, char **buf)
+{
+ struct platform_powerpc *platform = p->platform_data;
+ uint16_t resp_len = 8;
+ uint8_t resp[8];
+ uint8_t req[] = { 0x1, 0x3, 0x0, 0x0 };
+ int rc;
+
+ rc = ipmi_transaction(platform->ipmi, IPMI_NETFN_TRANSPORT,
+ IPMI_CMD_TRANSPORT_GET_LAN_PARAMS,
+ req, sizeof(req),
+ resp, &resp_len,
+ ipmi_timeout);
+
+ pb_debug("BMC IP resp [%d][%d]:\n", rc, resp_len);
+
+ if (rc == 0 && resp_len >= 6)
+ *buf = talloc_asprintf(platform, "%u.%u.%u.%u",
+ resp[2], resp[3], resp[4], resp[5]);
+
+ pb_log("BMC IP: %s\n", rc ? "unknown" : *buf);
+}
+
static void get_ipmi_bmc_mac(struct platform *p, uint8_t *buf)
{
struct platform_powerpc *platform = p->platform_data;
@@ -1317,8 +1340,10 @@ static int get_sysinfo(struct platform *p, struct system_info *sysinfo)
talloc_free(filename);
sysinfo->bmc_mac = talloc_zero_size(sysinfo, HWADDR_SIZE);
- if (platform->ipmi)
+ if (platform->ipmi) {
get_ipmi_bmc_mac(p, sysinfo->bmc_mac);
+ get_ipmi_bmc_ip(p, &sysinfo->bmc_ip);
+ }
if (platform->ipmi)
get_ipmi_bmc_versions(p, sysinfo);
diff --git a/lib/pb-protocol/pb-protocol.c b/lib/pb-protocol/pb-protocol.c
index cf4ddb4..cd258a5 100644
--- a/lib/pb-protocol/pb-protocol.c
+++ b/lib/pb-protocol/pb-protocol.c
@@ -287,6 +287,8 @@ int pb_protocol_system_info_len(const struct system_info *sysinfo)
/* BMC MAC */
len += HWADDR_SIZE;
+ len += 4 + optional_strlen(sysinfo->bmc_ip);
+
return len;
}
@@ -557,6 +559,8 @@ int pb_protocol_serialise_system_info(const struct system_info *sysinfo,
memset(pos, 0, HWADDR_SIZE);
pos += HWADDR_SIZE;
+ pos += pb_protocol_serialise_string(pos, sysinfo->bmc_ip);
+
*(bool *)pos = __cpu_to_be32(sysinfo->update_support);
pos += sizeof(bool);
@@ -1131,6 +1135,9 @@ int pb_protocol_deserialise_system_info(struct system_info *sysinfo,
pos += HWADDR_SIZE;
len -= HWADDR_SIZE;
+ if (read_string(sysinfo, &pos, &len, &sysinfo->bmc_ip))
+ goto out;
+
sysinfo->update_support = *(bool *)pos;
pos += sizeof(sysinfo->update_support);
diff --git a/lib/types/types.h b/lib/types/types.h
index 03dad2b..434dbb4 100644
--- a/lib/types/types.h
+++ b/lib/types/types.h
@@ -147,6 +147,7 @@ struct system_info {
unsigned int n_bmc_current;
unsigned int n_bmc_golden;
uint8_t *bmc_mac;
+ char *bmc_ip;
struct interface_info **interfaces;
unsigned int n_interfaces;
struct blockdev_info **blockdevs;
diff --git a/ui/ncurses/nc-sysinfo.c b/ui/ncurses/nc-sysinfo.c
index 2d3ce82..c2bcf5b 100644
--- a/ui/ncurses/nc-sysinfo.c
+++ b/ui/ncurses/nc-sysinfo.c
@@ -120,6 +120,9 @@ static void sysinfo_screen_populate(struct sysinfo_screen *screen,
line(_(" MAC: %s"), macbuf);
}
+ if (sysinfo->bmc_ip)
+ line(_(" IP: %s"), sysinfo->bmc_ip);
+
if (sysinfo->n_interfaces) {
line(NULL);
line(_("Network interfaces"));
--
2.15.1
More information about the Petitboot
mailing list