summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Amelkin <alexander@amelkin.msk.ru>2018-07-30 15:42:23 +0300
committerAlexander Amelkin <alexander@amelkin.msk.ru>2018-11-19 18:34:02 +0300
commit6bed638c2416190f7beda7f538a50f98b4d41630 (patch)
treef4c20438cf426cf3a8061e4552aa53701a11b3f6
parenta4c10404202ad0f5064ff6149a30aa86c844a7a1 (diff)
downloadipmitool-bugfix/26.tar.gz
Unfinished: Attempt to fix endianness for interfacesbugfix/26
This is a work in progress. This branch will be force-pushed a lot. Don't use it. This is just for saving the work as I move between workstations. Signed-off-by: Alexander Amelkin <alexander@amelkin.msk.ru>
-rw-r--r--include/ipmitool/ipmi_intf.h9
-rw-r--r--src/ipmitool.c6
-rw-r--r--src/plugins/ipmi_intf.c50
-rw-r--r--src/plugins/lanplus/lanplus.c123
4 files changed, 123 insertions, 65 deletions
diff --git a/include/ipmitool/ipmi_intf.h b/include/ipmitool/ipmi_intf.h
index 2ca409f..68668ed 100644
--- a/include/ipmitool/ipmi_intf.h
+++ b/include/ipmitool/ipmi_intf.h
@@ -241,6 +241,15 @@ struct ipmi_intf {
void (*set_max_response_data_size)(struct ipmi_intf * intf, uint16_t size);
};
+/* Interface method wrappers to perform any host-specific actions */
+struct ipmi_rs *ipmi_sendrecv(struct ipmi_intf * intf, struct ipmi_rq * req);
+struct ipmi_rs *ipmi_recv_sol(struct ipmi_intf * intf);
+struct ipmi_rs *ipmi_send_sol(struct ipmi_intf * intf, struct ipmi_v2_payload * payload);
+int ipmi_keepalive(struct ipmi_intf * intf);
+int ipmi_set_my_addr(struct ipmi_intf * intf, uint8_t addr);
+void ipmi_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size);
+void ipmi_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size);
+
struct ipmi_intf * ipmi_intf_load(char * name);
void ipmi_intf_print(struct ipmi_intf_support * intflist);
diff --git a/src/ipmitool.c b/src/ipmitool.c
index 3ee8b50..2b7a691 100644
--- a/src/ipmitool.c
+++ b/src/ipmitool.c
@@ -132,6 +132,12 @@ main(int argc, char ** argv)
{
int rc;
+#ifdef WORDS_BIGENDIAN
+ printf("BIG ENDIAN\n");
+#else
+ printf("LITTLE ENDIAN\n");
+#endif
+
rc = ipmi_main(argc, argv, ipmitool_cmd_list, NULL);
if (rc < 0)
diff --git a/src/plugins/ipmi_intf.c b/src/plugins/ipmi_intf.c
index f6bd2f6..f223490 100644
--- a/src/plugins/ipmi_intf.c
+++ b/src/plugins/ipmi_intf.c
@@ -623,3 +623,53 @@ ipmi_intf_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size)
intf->max_response_data_size = size;
}
}
+
+/*
+ * Interface method wrappers.
+ * Do any host-specific things like byteswapping here.
+ * Command-specific data manipulation is not done here,
+ * only the common headers are mangled.
+ */
+struct ipmi_rs *ipmi_sendrecv(struct ipmi_intf * intf, struct ipmi_rq * req)
+{
+ struct ipmi_rs *rsp;
+
+ /* Data length must be in IPMI order (LE) */
+ htoipmi16(req->msg.data_len, &req->msg.data_len);
+ rsp = intf->sendrecv(intf, req);
+ if (rsp) {
+ rsp->data_len = ipmi16toh(&rsp->data_len);
+ }
+
+ return rsp;
+}
+
+struct ipmi_rs *ipmi_recv_sol(struct ipmi_intf * intf)
+{
+ return intf->recv_sol(intf);
+}
+
+struct ipmi_rs *ipmi_send_sol(struct ipmi_intf * intf, struct ipmi_v2_payload * payload)
+{
+ return intf->send_sol(intf, payload);
+}
+
+int ipmi_keepalive(struct ipmi_intf * intf)
+{
+ return intf->keepalive(intf);
+}
+
+int ipmi_set_my_addr(struct ipmi_intf * intf, uint8_t addr)
+{
+ return intf->set_my_addr(intf, addr);
+}
+
+void ipmi_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size)
+{
+ intf->set_max_request_data_size(intf, size);
+}
+
+void ipmi_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size)
+{
+ intf->set_max_response_data_size(intf, size);
+}
diff --git a/src/plugins/lanplus/lanplus.c b/src/plugins/lanplus/lanplus.c
index b7dfc3d..4591078 100644
--- a/src/plugins/lanplus/lanplus.c
+++ b/src/plugins/lanplus/lanplus.c
@@ -909,46 +909,38 @@ void
read_open_session_response(struct ipmi_rs * rsp, int offset)
{
memset(&rsp->payload.open_session_response, 0,
- sizeof(rsp->payload.open_session_response));
+ sizeof(rsp->payload.open_session_response));
- /* Message tag */
- rsp->payload.open_session_response.message_tag = rsp->data[offset];
+ /* Message tag */
+ rsp->payload.open_session_response.message_tag = rsp->data[offset];
- /* RAKP response code */
- rsp->payload.open_session_response.rakp_return_code = rsp->data[offset + 1];
+ /* RAKP response code */
+ rsp->payload.open_session_response.rakp_return_code = rsp->data[offset + 1];
- /* Maximum privilege level */
- rsp->payload.open_session_response.max_priv_level = rsp->data[offset + 2];
+ /* Maximum privilege level */
+ rsp->payload.open_session_response.max_priv_level = rsp->data[offset + 2];
- /*** offset + 3 is reserved ***/
+ /*** offset + 3 is reserved ***/
- /* Remote console session ID */
- memcpy(&(rsp->payload.open_session_response.console_id),
- rsp->data + offset + 4,
- 4);
- #if WORDS_BIGENDIAN
- rsp->payload.open_session_response.console_id =
- BSWAP_32(rsp->payload.open_session_response.console_id);
- #endif
+ /* Remote console session ID */
+ rsp->payload.open_session_response.console_id
+ = ipmi32toh(&rsp->data[offset + 4]);
/* only tag, status, privlvl, and console id are returned if error */
- if (rsp->payload.open_session_response.rakp_return_code !=
- IPMI_RAKP_STATUS_NO_ERRORS)
- return;
-
- /* BMC session ID */
- memcpy(&(rsp->payload.open_session_response.bmc_id),
- rsp->data + offset + 8,
- 4);
- #if WORDS_BIGENDIAN
- rsp->payload.open_session_response.bmc_id =
- BSWAP_32(rsp->payload.open_session_response.bmc_id);
- #endif
-
- /* And of course, our negotiated algorithms */
- rsp->payload.open_session_response.auth_alg = rsp->data[offset + 16];
- rsp->payload.open_session_response.integrity_alg = rsp->data[offset + 24];
- rsp->payload.open_session_response.crypt_alg = rsp->data[offset + 32];
+ if (rsp->payload.open_session_response.rakp_return_code
+ != IPMI_RAKP_STATUS_NO_ERRORS)
+ {
+ return;
+ }
+
+ /* BMC session ID */
+ rsp->payload.open_session_response.bmc_id
+ = ipmi32toh(&rsp->data[offset + 8]);
+
+ /* And of course, our negotiated algorithms */
+ rsp->payload.open_session_response.auth_alg = rsp->data[offset + 16];
+ rsp->payload.open_session_response.integrity_alg = rsp->data[offset + 24];
+ rsp->payload.open_session_response.crypt_alg = rsp->data[offset + 32];
}
@@ -976,13 +968,13 @@ read_rakp2_message(
int offset,
uint8_t auth_alg)
{
- int i;
+ int i;
- /* Message tag */
- rsp->payload.rakp2_message.message_tag = rsp->data[offset];
+ /* Message tag */
+ rsp->payload.rakp2_message.message_tag = rsp->data[offset];
- /* RAKP response code */
- rsp->payload.rakp2_message.rakp_return_code = rsp->data[offset + 1];
+ /* RAKP response code */
+ rsp->payload.rakp2_message.rakp_return_code = rsp->data[offset + 1];
/* Console session ID */
rsp->payload.rakp2_message.console_id = ipmi32toh(&rsp->data[offset + 4]);
@@ -1004,38 +996,39 @@ read_rakp2_message(
/* Nothing to do here */
break;
- case IPMI_AUTH_RAKP_HMAC_SHA1:
- /* We need to copy 20 bytes */
- for (i = 0; i < IPMI_SHA_DIGEST_LENGTH; ++i) {
- rsp->payload.rakp2_message.key_exchange_auth_code[i] =
- rsp->data[offset + 40 + i];
- }
- break;
+ case IPMI_AUTH_RAKP_HMAC_SHA1:
+ /* We need to copy 20 bytes */
+ for (i = 0; i < IPMI_SHA_DIGEST_LENGTH; ++i) {
+ rsp->payload.rakp2_message.key_exchange_auth_code[i]
+ = rsp->data[offset + 40 + i];
+ }
+ break;
- case IPMI_AUTH_RAKP_HMAC_MD5:
- /* We need to copy 16 bytes */
- for (i = 0; i < IPMI_MD5_DIGEST_LENGTH; ++i) {
- rsp->payload.rakp2_message.key_exchange_auth_code[i] =
- rsp->data[offset + 40 + i];
- }
- break;
+ case IPMI_AUTH_RAKP_HMAC_MD5:
+ /* We need to copy 16 bytes */
+ for (i = 0; i < IPMI_MD5_DIGEST_LENGTH; ++i) {
+ rsp->payload.rakp2_message.key_exchange_auth_code[i]
+ = rsp->data[offset + 40 + i];
+ }
+ break;
#ifdef HAVE_CRYPTO_SHA256
- case IPMI_AUTH_RAKP_HMAC_SHA256:
- /* We need to copy 32 bytes */
- for (i = 0; i < IPMI_SHA256_DIGEST_LENGTH; ++i) {
- rsp->payload.rakp2_message.key_exchange_auth_code[i] =
- rsp->data[offset + 40 + i];
- }
- break;
+ case IPMI_AUTH_RAKP_HMAC_SHA256:
+ /* We need to copy 32 bytes */
+ for (i = 0; i < IPMI_SHA256_DIGEST_LENGTH; ++i) {
+ rsp->payload.rakp2_message.key_exchange_auth_code[i]
+ = rsp->data[offset + 40 + i];
+ }
+ break;
#endif /* HAVE_CRYPTO_SHA256 */
- default:
- lprintf(LOG_ERR, "read_rakp2_message: no support "
- "for authentication algorithm 0x%x", auth_alg);
- assert(0);
- break;
- }
+ default:
+ lprintf(LOG_ERR,
+ "read_rakp2_message: no support "
+ "for authentication algorithm 0x%x", auth_alg);
+ assert(0);
+ break;
+ }
}